您现在的位置是:首页 > 文章详情

java代理模式

日期:2019-03-05点击:390


前言:

看有关于技术的文章需要带着问题去看,我上周在公司做了一场设计模式的技术分享,在会上又不同的小伙伴提出了很多疑问,那么今天我就来解决一下这一些疑问,非常感谢参与会议的小伙伴。



问题

一、什么是设计模式?

二、为什么JDK动态代理与CGLIB动态代理生成的源代码是差不多的?

三、代理模式相比直接使用接口有什么好处吗?

四、如果接口被多个类实现会怎样?




问题1:什么是设计模式

设计模式是一种经验能够使新手更加简单的使用前人的经验和方案

可以避免重复劳动,就像一句在这个行业流行的话不要重复造轮子

设计模式是针对特定上下文的特定问题的解决方案,解决方案被抽象化、模版化、就是设计模式,学习设计模式的关键是理解,理解方法理解思想理解观念。

不是为了使用设计模式而,设计的根本是为了可复用、可拓展、高性能不要为了使用设计模式而使用,一定要结合实际环境的去考虑整个问题。


每一种模式有四个基本元素:模式名称、问题描述、应用场景、应用后效果。


设计模式在应用中遵循六大原则:

  • 开闭原则:对扩展开放,对修改关闭。
  • 里氏代换原则:任何基类可以出现的地方,子类一定可以出现。
  • 依赖倒转原则:针对接口编程,依赖于抽象而不依赖于具体。
  • 接口隔离原则:使用多个隔离的接口,比使用单个接口要好。
  • 迪米特法则:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
  • 合成复用原则:原则是尽量使用合成/聚合的方式,而不是使用继承。



代理模式分为两种:静态代理、动态代理,这两者有什么区别呢?往下看就明白了。

什么是代理模式:为其他对象提供一种代理以控制对这个对象的访问(例:AOP、拦截器)。

代理模式的角色:被代理者与代理者实现的接口、代理类、被代理类。



一、静态代理模式:

静态代理由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class就已经存在了。


UML图:

238865e4a18dce4b24b67258861943cf5be1b08f

图中含有接口(person)、代理类(proxy)、被代理类(target),带代理者与代理者都实现了person的接口,client在调用时是直接访问的被代理类(proxy),代理类在buy方法中引用了targer类中的buy方法,可以在代理前、代理后做一些其他的业务逻辑处理,控制targer的访问。


下面直接上代码,一步步引出静态代理的优点与缺点:


接口:

package proxyblogs; /** * 人的行为接口. */ public interface person { /** * 买东西. * * @param name 商品名称. * @return int * @author null */ int buy(String name); 


Target类(被代理者):


package proxyblogs; /** * @ClassName Target. * Create by Null on 2019/2/26/19:29 **/ public class Target implements person { /** * 买东西. * * @param name 商品名称. * @return int 价格 * @author null */ @Override public int buy(String name) { if (name.equals("apple")) { return 5; } else { return 3; } } } 


proxy类(代理者):


package proxyblogs; /** * @ClassName proxy. * Create by Null on 2019/2/26/19:30 **/ public class proxy implements person { /** * 买东西. * * @param name 商品名称. * @return int * @author null */ @Override public int buy(String name) { int buy = new Target().buy(name); //运费 int freight = 2; return buy + freight; } } 

test测试类


package proxyblogs; /** * @ClassName Test. * Create by Null on 2019/2/26/19:39 **/ public class Test { public static void main(String[] args) { int money = new proxy().buy("apple"); System.out.println(money); } } 

执行结果:


7 Process finished with exit code 0


优点:

一、相对于动态代理来说,程序比较简易、性能比动态代理要高。


缺点:

一、静态代理类和被代理类实现了相同的接口,代理类通过被代理类实现了相同的方法。这样就出现了大量的代码重复,增加了代码维护的复杂度。
二、静态代理只服务于一种类型的对象, 如果要服务 多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模 稍大时就无法胜任了。





原文链接:https://yq.aliyun.com/articles/692564
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章