一、定义
为其它对象提供一种代理,以控制对这对象的访问。
二、类图
三、代理三要素
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等发布的依赖
也许你现在还觉得很郁闷,为什么要使用代理。但是想想现实世界中,打官司为什么要找个律师?因为你不想参与到中间过程的是是非非,只需要完成自己的答辩,其它诸如事前调查、事后追查都由律师来搞定,这就是为了减轻你的负担。
六、扩展
静态代理和动态代理的介绍,可以参考下一篇 静态代理和动态代理