一、定义、类型及类图
- 定义:为某个对象提供一个代理,从而控制这个代理的访问。
- 特点:
- 代理类和委托类具有共同的父类或父接口,这样在任何使用委托类对象的地方都可以使用代理类对象替代。
- 代理类负责请求的预处理、过滤,将请求分配给委托类处理,以及委托类处理完请求的后续处理。
- 类型:结构类模式
- 类图:
二、代理模式结构
- 抽象角色:真实对象和代理对象的共同接口。
- 代理角色:代理对象角色内部含有对真实对象的引用。从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
- 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
三、分类
- 根据代理类的生成时间不同可以将代理分为静态代理和动态代理两种。
四、静态代理
由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
- 抽象角色:
-
public interface AbstractSubject { void doSomething(); }
- 代理角色:
-
public class ProxySubject implements AbstractSubject{ private AbstractSubject real ; public ProxySubject(AbstractSubject real) { this.real=real ; } @Override public void doSomething() { real.doSomething(); } public void doOtherthing() { } }
- 真实角色:
-
public class RealSubject implements AbstractSubject{ @Override public void doSomething() { System.out.println( "真实角色被使用" ); } }
- 客户端:
-
public class Client { public static void main(String[] args ) { RealSubject real = new RealSubject(); ProxySubject proxy = new ProxySubject( real ); proxy.doSomething(); } }
- 静态代理的优缺点:
- 优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
- 缺点:
- 代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。
- 如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
五、动态代理
- 动态代理类的源码是程序在运行期间由JVM根据反射等机制动态生成的,所以不存在代理类的字节码文件。代理角色和真实角色的联系在程序运行时确定。
- 待完善。。。。。
参考博客:
https://blog.csdn.net/xu__cg/article/details/52970885
http://layznet.iteye.com/blog/1182924
https://www.ibm.com/developerworks/cn/java/j-lo-proxy1/
待参考博客:
https://blog.csdn.net/lpjishu/article/details/52235290
https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/proxy.html
整理的设计模式实例: