代理模式为一个对象提供一个替身以控制对这个对象的访问,跟我们日常所说的代理类似,分为静态代理和动态代理两种。
静态代理:代理对象在编译时就已经创建好了,如下:
//该接口是对被访问者〔目标对象〕的抽象。
public interface Subject {
String request〔〕;
}
//被访问者〔目标对象〕的具体实现类。如果你想访问某位明星,那么SubjectImpl就是你想访问的明星。
public class SubjectImpl implements Subject {
public String request〔〕{
//process logic
return "OK";
}
}
//被访问者的代理实现类〔代理对象〕,该类持有一个Subject接口的具体实例〔目标对象〕
public class SubjectProxy implements Subject {
private Subject subject;
SubjectProxy〔Subject subject〕{
this.subject=subject;
}
public String request〔〕{
//add pre-process if necessary
String originalResult=subject.request〔〕;
//add post-process if necessary
return "Proxy"+originalResult;
}
}
//代表访问者的抽象角色
public class Client {
public static void main〔〕{
Subject subjectProxy=new SubjectProxy〔new SubjectImpl〕;
subjectProxy.request〔〕;
}
}
在将请求转发给目标对象SubjectImpl之前或之后,都可以根据情况插入其他处理逻辑,比如日志处理、事务处理等〔横切逻辑〕。当系统使用这个代理对象运行的时候,原有逻辑实现和横切逻辑就完全融合到一起。
静态代理缺陷:针对不一样的目标对象,我们要为其单独实现一个代理对象,而实际上这些代理对象所要添加的横切逻辑有可能都是一样的,比如事务处理。当系统中存在成千上百个目标对象时,我们就要为这成千上百个目标对象创建成千山白个代理对象,显然是不可能的,这就需要寻求动态代理的帮助。