一、定义
为其它对象提供一种代理,以控制对这对象的访问。
二、类图
三、代理三要素
1.Subject 抽象主题角色(共同接口)
可以是抽象类或者接口,是一个最普通的业务类型定义,无特殊要求。
public interface Subject { //定义一个方法 public void request(); }
2.RealSubject 具体主题角色(真实对象)
也叫被代理角色。是业务逻辑的具体执行者。
public class RealSubject implements Subject { //实现方法 public void request() { // TODO 业务逻辑处理 } }
3.Proxy 代理主题角色(代理对象)
也叫代理类。负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色去实现,并且在真实主题角色处理完毕前后做预处理和善后操作。
public class Proxy implements Subject { //要代理哪个实现类 private Subject subject = null; //通过构造函数传递代理者 public Proxy(Subject subject){ this.subject = subject; } //实现接口中定义的方法 public void request() { this.before(); this.subject.request(); this.after(); } //预处理 private void before(){ //do something } //善后处理 private void after(){ //do something } }
四、优点
1.职责清晰
真实角色就是实现实际的业务逻辑,而不需要关心其他非本职工作(例如前处理、后处理),通过代理完成一件事务,结果就是编程简洁清晰。
2.高扩展性
具体的主题角色是随时都可能发生变化的,当需要改变时,通过代理类,我们就可以做到不修改原角色下实现扩展。
五、使用场景
通常用于对原有逻辑进行扩展。比如现在持有二方包的某些类,需要调用其中的某些方法并添加一些方法,例如打印日志等,但是又不方便将这些逻辑直接加在二方包的方法里,那么我们就可以通过使用代理的方式来进行。
扩展:一方包、二方包、三方包是什么?
一方包:本工程内的各模块的相互依赖
二方包:公司内部的依赖库,一般指公司内部的其他项目发布的jar包
三方包:公司之外的开源库,比如apache、google等发布的依赖
也许你现在还觉得很郁闷,为什么要使用代理。但是想想现实世界中,打官司为什么要找个律师?因为你不想参与到中间过程的是是非非,只需要完成自己的答辩,其它诸如事前调查、事后追查都由律师来搞定,这就是为了减轻你的负担。
六、扩展
静态代理和动态代理的介绍,可以参考下一篇博文 静态代理和动态代理
查看更多:设计模式分类以及六大设计原则