代理模式
-
定义:
又叫委派模式,给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。简而言之,就是一种访问目标对象的方式,通过代理对象实现对目标对象的使用,同时也控制了外界对目标对象的访问。通俗来讲就是我们现实中的中介。
-
使用场景:
代理模式一般可以分为两种,动态代理和静态代理。
代理类主要是负责为委派类预处理消息、过滤消息、把消息传送给委派类,以及事后对结果的处理。代理类不是服务类,而是提供服务的,真正的服务由委派类去执行。
代理模式主要是为了提供控制访问。
- 静态代理:程序员创建的工具类,代理类和委派类的关系在运行前就确定的。
- 动态代理:程序运行期间由JVM根据反射机制动态的生成,所以不存在代理类的字节码文件。代理类和委派类的关系是在程序运行时确定的。
-
UML:
- Subject:被委派的抽象类或是接口。
- RealSubject:被委派或者被代理的角色,业务具体的执行者。
- Proxy:代理类或者委派类,负责对被委派类的应用。
-
优点:
- 被委派类或者被代理类可以更加专注于主要功能的实现,而无须考虑其他。
- 代理类可以在被代理类中添加功能。
- 可以很好的控制被代理类的访问情况,保证数据的安全。
-
缺点:
- 静态代理时代理类和被代理类都要实现相同的接口,会出现代码重复,还有增加了代码的维护的难度。
- 代理对象只负责一钟类型的对象,如果静态代理规模比较大的话,系统的压力也就比较大。
- 动态代理始终无法摆脱仅支持接口代理的处境。
-
样例:
静态代理:
public interface Subject{ /** * 接口方法 */ void request() ; }
public class RealSubject implements Subject { @Override public void request(){ System.out.println("RealSubject.request()方法被执行") ; } }
public class Proxy implements Subject { private Subject subject ; public Proxy(Subject subject){ this.subject = subject ; } @Override public void request(){ this.before() ; System.out.println("Proxy.request()方法被执行") ; this.subject.request() ; this.after() ; } public void before(){ //预处理 } public void after(){ //后处理 } }