当前位置:首页 > CN2资讯 > 正文内容

[Java] 静态代理 - 动态代理 01java静态代理和动态代理

2天前CN2资讯
什么叫代理? 什么是静态代理?什么是动态代理?
 Java 动态代理模式 
代理:一个角色代表另一个角色来完成某些特定的功能。 
   比如:生产商,中间商,客户这三者这间的关系  
            客户买产品并不直接与生产商打交道,也不用知道产品是如何产生的,客户只与中间商打交道,而中间商就可以对产品进行一些包装,提供一些售后的服务。
 * 代理模式有三个角色: 1. 抽象主题角色 2. 代理主题角色 3. 实际被代理角色
下面我们来个一个静态代理的实现。 
我以一个坦克为例。
 1, 现在我们来建立一个java项目,叫Proxy,建立一个类,叫Tank, 继续建立一个接口,
   叫 Moveable, 我们用 Tank 来实现 Moveable(意思就是坦克实现移动)
抽象主题角色:Moveable package com.bjsxt.proxy; public interface Moveable { void move(); } 代理主题角色:TanktimeProxy package com.bjsxt.proxy; public class TankTimeProxy implements Moveable { Moveable t; public TankTimeProxy(Moveable t) { super(); this.t = t; } @Override public void move() { long start = System.currentTimeMillis(); System.out.println("starttime : " + start); t.move(); long end = System.currentTimeMillis(); System.out.println("time : " + (end - start)); } } 实际被代理对象:Tank package com.bjsxt.proxy; import java.util.Random; public class Tank implements Moveable { @Override public void move() { System.out.println("Tank Moving..."); try { Thread.sleep(new Random().nextInt(10000)); // 产生 100 毫秒 (10秒 ) 以内的随机数 } catch (InterruptedException e) { e.printStackTrace(); } } } 测试:TestTank.javapackage com.bjsxt.proxy; public class TestTank { public static void main(String[] args) { Tank t = new Tank(); Moveable move = new TankTimeProxy(t); move.move(); } }   从上例可以看到代理主题角色:TanktimeProxy实现了对Tank的move()方法运行时间的计算,而TanktimeProxy,Tank都实现了Moveable接口,通过调用TanktimeProxy的move()方法我们可以实现对Tank的move()方法的运行时间的计算,而不用在Tank的move()方法中作任何实现,这就是代理的作用。代理实现时TanktimeProxy,Tank必需实现Moveable接口。

下面我想在 TanK 的 move() 方法前后加上日志: 

   我必需再写一个类来实现这一功能:package com.bjsxt.proxy; public class TankLogProxy implements Moveable { Moveable t; public TankLogProxy(Moveable t) { super(); this.t = t; } @Override public void move() { System.out.println("Tank start"); t.move(); System.out.println("Tank end"); } } 测试:package com.bjsxt.proxy; public class Client { public static void main(String[] args) throws Exception { Tank t = new Tank(); // 最初的代理对象 TankTimeProxy ttp = new TankTimeProxy(t); TankLogProxy tlp = new TankLogProxy(ttp); Moveable m = tlp; /* 时间包日志 * * TankLogProxy tlp = new TankLogProxy(t); * TankTimeProxy ttp = new TankTimeProxy(tlp); * Moveable m = ttp; * * */ m.move(); } } // 可以对任意的对象、任意的接口方法,实现任意的代理

  这样我通过代理在Tank的move()方法前后加入了日志和时间统计的功能,由于TanktimeProxy,TanklogProxy都实现了Moveable接口,所以TanklogProxy可以代理TanktimeProxy,反过来也可以,它们对Tank的代理顺序是可以交换的。 满足我们的要求,如果现在我们要先时间,再日志,我们只需要修改一下测试类就oK

这上面的就可以叫静态代理

现在有出现了一个问题?如果我现在有多个类,那我是不是要去实现多个计时,多个日志,那不是和刚才的继承一样,造成了类的大量产生(重复),这样显然是不合理的,那我们带怎么办喃?我们现在就可以使用动态代理

如果我想在Tank的move()方法调用的前后加入更多的功能,是不是要写更多的代理主题角色,这样子会使得代码过于臃肿,不易于维护,那有没有什么办法可以解决呢,答案是可以的,我们可以动态的来生成代理主题角色,来代理所有的被代理对象,这就是动态代理。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

动态代理-你不必知道我存在
    理解 Spring 的 AOP
假设 :
  (1), 具备面向对象的设计思维
  (2), 了解多态的概念
  (3), 大致了解反射(非必须)
真实案例
 (1), 想知道一个方法的运行时间
     @1), 继承 VS  聚合 (一个类有另一个类的对象)
 tank2 与 tank3 其实都是代理的方法。 tank2与tank3都是代理类

Tank2.java

package com.bjsxt.proxy; public class Tank2 extends Tank { @Override public void move() { long start = System.currentTimeMillis(); super.move(); long end = System.currentTimeMillis(); System.out.println("time : " + (end - start)); } }

继承实现代理有缺点。 实现interface的实现代理好



 这两个哪个好喃?

      如果现在我们还要增加一个日志的功能,如果是继承,我们还要写一个类来继承Tank2,但是用户又说,我要求先日志,在计算时间,那么是不是又要写个类来实现movaable接口,来修改喃,这样就会造成类的无限增长,这显然是不合理的,所以我们要用聚合。。聚合,无论你增加多少功能,我都可以互相交换.



    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/23983.html

    分享给朋友:

    “[Java] 静态代理 - 动态代理 01java静态代理和动态代理” 的相关文章

    Hostloc论坛:主机爱好者的交流与协作平台

    在这个快速发展的互联网时代,信息交流变得尤为重要,Hostloc论坛正是这样一个致力于主机相关话题交流的平台。论坛的创办源于一群热衷于主机技术的人士,他们希望通过建立一个开放的讨论空间,分享自己的经验和见解。随着时间的推移,Hostloc逐渐发展成为一个全球知名的主机论坛,吸引了来自各个国家的用户共...

    深入探讨144GB显存显卡在深度学习中的应用与优势

    在谈到现代显卡时,144GB显存无疑成为了一个引人注目的热门话题。显存是显卡中极为关键的一部分,决定着我们在高性能计算、图形处理和深度学习等领域的使用体验。显存的容量直接影响到显卡在执行复杂任务时的能力,而144GB的显存容量,帮助我们突破了许多传统显存限制。 首先,显存的基本概念就像是计算机的临时...

    续费同价服务器:云服务的透明定价策略与用户优势

    续费同价服务器是什么呢?说白了,就是云服务提供商在定价上采取的一种政策。无论是新用户第一次购买,还是老用户续费,价格都是一样的。这种做法让很多用户感到安心,不用担心下次续费时价格会大幅上涨。这一策略在云服务行业越来越受到重视,也给用户带来了不少好处。 首先,续费同价服务器让价格变得透明。我之前在选择...

    QQ邮箱服务器完全指南:配置、安全性与优化技巧

    QQ邮箱服务器概述 QQ邮箱是由腾讯公司推出的一款广受欢迎的电子邮件服务。它的优势不仅在于强大的存储容量,还有丰富的功能,适合个人和企业用户使用。很多人都习惯使用QQ邮箱来发送、接收邮件,因此有必要了解其背后的邮件服务器。 在我使用QQ邮箱的过程中,发现它使用的是腾讯自家搭建的邮件服务器。这些服务器...

    如何解决甲骨文IP被墙的问题及有效方法

    谈到甲骨文,大家可能会联想到古老的文字和悠久的历史,然而随着信息技术的飞速发展,甲骨文的应用已经不仅仅局限于文化研究。在数据存储、信息管理等领域,甲骨文的IP(互联网协议)在全球范围内发挥着重要的作用。不幸的是,现如今许多用户却发现自己无法正常访问这些IP。这就是我们所说的“甲骨文IP被墙”的现象。...

    如何在Vultr上添加适合的充值金额和选择合适的VPS方案

    Vultr概述 Vultr是一家在云服务领域颇有声誉的公司,它以提供高性能的虚拟专用服务器(VPS)而闻名。Vultr不仅在全球范围内拥有多个数据中心,还以其灵活的方案和易于扩展的功能,赢得了众多用户的青睐。在激烈的市场竞争中,Vultr凭借其合理的价格和优化的服务流程,使自己脱颖而出,成为许多个人...