美文网首页
java设计模式之代理模式

java设计模式之代理模式

作者: 这一刻_776b | 来源:发表于2020-01-11 14:57 被阅读0次

所谓代理就通过引用一个新的对象来实现对真实对象的操作或者将新的对象当做真实对象的一个替身,这种实现的机制就是代理模式,通过引用代理对象来访问真实对象就是代理模式的设计动机。

代理模式即一个类(代理类)具有另一个类(被代理类)的所有行为。代理类可以在不更改业务逻辑的情况下扩展被代理类的方法,达到让被代理类更加专注的去处理本身所具有的业务逻辑。 代理模式包括动态代理和静态代理。静态代理是指在程序运行之前已经存在的代理类及代理实现,即开发者需要在程序运行之前就写好代理类及代理实现。动态代理是指程序运行之后,根据业务逻辑需求,动态的获取、创建被代理类的功能。可以采用JDK、CGLIB来实现动态代理。

一、模式定义

       代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。

       在代理模式中,“第三者”代理主要是起到一个中介的作用,它连接客户端和目标对象。

二、模式结构

       下图是代理模式UML结构图

     在代理模式中有如下三个角色:

       Subject: 抽象角色。声明真实对象和代理对象的共同接口。

       Proxy: 代理角色。代理对象与真实对象实现相同的接口,所以它能够在任何时刻都能够代理真实对象。代理角色内部包含有对真实对象的引用,所以她可以操作真实对象,同时也可以附加其他的操作,相当于对真实对象进行封装。

       RealSubject: 真实角色。它代表着真实对象,是我们最终要引用的对象

 四、 模式优缺点

优点

       1、 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

       2、 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的

缺点

       1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。

       2、 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

五、模式适用场景

       1、 远程代理:为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

       2、 虚拟代理:通过使用过一个小的对象代理一个大对象。这样就可以减少系统的开销。

       3、 保护代理:用来控制对真实对象的访问权限。

六、模式总结

       1、代理模式是通过使用引用代理对象来访问真实对象,在这里代理对象充当用于连接客户端和真实对象的中介者。

       2、代理模式主要用于远程代理、虚拟代理和保护代理。其中保护代理可以进行访问权限控制。

Java动态代理和静态代理

7.1 java静态代理

静态代理通常用于对原有业务逻辑的扩充。比如持有二方包的某个类,并调用了其中的某些方法。然后出于某种原因,比如记录日志、打印方法执行时间,但是又不好将这些逻辑写入二方包的方法里。所以可以创建一个代理类实现和二方方法相同的方法,通过让代理类持有真实对象,然后在原代码中调用代理类方法,来达到添加我们需要业务逻辑的目的。

这其实也就是代理模式的一种实现,通过对真实对象的封装,来实现扩展性。

7.2 java动态代理

搞清楚静态代理的缺点十分重要,因为动态代理的目的就是为了解决静态代理的缺点。通过使用动态代理,我们可以通过在运行时,动态生成一个持有RealObject、并实现代理接口的Proxy,同时注入我们相同的扩展逻辑。哪怕你要代理的RealObject是不同的对象,甚至代理不同的方法,都可以动过动态代理,来扩展功能。

简单理解,动态代理就是我们上面提到的方案一,只不过这些proxy的创建都是自动的并且是在运行期生成的。

7.3 CGLIB动态代理

JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

CGLIB是一个强大的高性能的代码生成包。被广泛的许多AOP框架使用,如Spring的AOP和dynaop,为他们提供方法的interceptor(拦截),最流行的是OR Mapping工具Hibernate也是使用CGLIB来代理单端的single-ended(多对一和一对一)关联(对集合的延迟抓取是采用其他机制实现)。EsayMock和jMock是通过模仿(moke)对象来测试java代码的包。他们都是通过使用CGLIB来为那些没有接口的类创建模仿(moke)对象。

八、参考文献

https://segmentfault.com/a/1190000011291179

https://blog.csdn.net/fighterandknight/article/details/51200470

http://c.biancheng.net/view/1359.html

相关文章

  • Java代理模式之JDK动态代理

    了解什么是动态代理模式,可参考Java设计模式之代理模式 简介 JDK动态代理是java.lang.reflect...

  • java之代理技术

    java之代理模式 直接聊技术! 描述 代理模式是常用的java设计模式,代理类主要负责为委托类预处理消息、过滤消...

  • Java设计模式之代理模式

    Java设计模式之代理模式 代理模式 静态代理 动态代理 为什么需要代理 通过代理,我们能够不用知道委托人是谁,而...

  • java动态代理(JDK和cglib)(转载自http://ww

    java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是...

  • Spring AOP源码解析

    欲了解AOP,需先了解Java动态代理;欲了解Java动态代理,先熟悉设计模式之代理模式。入门有道,先从简学。 1...

  • java设计模式之代理模式(静态代理)

      今天给大家分享的是java设计模式之代理模式中的静态代理模式,动态代理模式将在后面文章中给出。如有不足,敬请指...

  • Java代理模式之CGLIB动态代理

    了解什么是动态代理模式,可参考Java设计模式之代理模式 简介 前面我们了解了JDK动态代理技术,发现其真实对象必...

  • java建造者模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java单例模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java外观模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

网友评论

      本文标题:java设计模式之代理模式

      本文链接:https://www.haomeiwen.com/subject/azmsactx.html