1、概念;
代理模式:为其他对象提供一种代理,以控制对该对象的访问;
使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理的对象可以是远程对象、创建开销大的对象、需要安全控制的对象;
2、类图;
3、使用场景;
1)代理远程对象,使得调用远程对象,就好像调用本地对象一样;
2)代理开销大的对象,使得开销大的对象在使用时才创建;
3)需要安全控制的对象,使用代理对象隔离客户端直接访问对象,由代理对象控制客户可访问对象的哪些方法;
4)代理对象可以在真实对象执行前、执行后等做一些额外的工作;
4、代码实现;
1)主题接口;
public interface Subject {
void request();
}
2)主题具体实现类;
public class RealSubject implements Subject{
@Override
public void request() {
System.out.println("i am real subject.");
}
}
3)代理实现类;
public class RealSubjectProxy implements Subject{
private RealSubject realSubject;
public RealSubjectProxy() {
realSubject = new RealSubject();
}
@Override
public void request() {
preRequest();
realSubject.request();
afterRequest();
}
private void preRequest(){
System.out.println("prev request.");
}
private void afterRequest(){
System.out.println("after request.");
}
}
4)测试;
public class Client {
public static void main(String[] args) {
RealSubjectProxy proxy = new RealSubjectProxy();
proxy.request();
System.out.println("====================");
RealSubject002Proxy proxy002 = new RealSubject002Proxy();
proxy002.request002();
System.out.println("====================");
}
}
5、静态代理模式的不足;
1)RealSubject这个真实角色,由RealSubjectProxy这个代理类进行了代理。
2)当增加一个RealSubject2的真实角色时,RealSubject2中的方法为request2(),如果需要代理RealSubject2这个真实角色,那么可能就会多一个RealSubject2Proxy的代理类。
3)如果有很多的RealSubjectN的真实角色,那么就会有n个RealSubjectNProxy的代理类。举例如下:
4)这在某些场景下,静态代理是不允许的,例如真实角色有很多的情况下。
5)还有一种情况就是,只有在客户端使用时,才知道具体代理类是什么。这个时候,需要动态的生成代理对象,而静态代理无法满足。
6)当真实角色有很多,或是需要动态生成代理类时,可以选用动态代理模式;
7)动态代理,即在客户端真正使用时,根据被代理角色,动态生成出代理对象,来控制对被代理角色的访问;