代理模式
模式简介
代理模式是设计模式中的一种结构型模式(Structure Pattern),主要应用于:提供一个代理对象(Proxy)控制对一个对象(被代理对象)的访问。
UML图
类图
运行时的对象图如下:
组成部分
- Proxy
- 持有一个Subject实例的引用,以便在Client访问Subject实例的时候,将请求转发给Subject实例;
- 对客户端提供和Subject一样的接口(实现Subject接口),这样就Proxy实例就可以替换Subject实例;
- 控制对RealSubject实例的访问,负责如何创建以及销毁它;
- 按照设计意图又可以分为几类Proxy
- remote proxy : 将客户对RealSubject的请求和参数编码,然后将编码后的请求和参数转发到位于不同地址空间的RealSubject实例;
- virtual proxy:保存关于RealSubject额外的调用信息,延迟对RealSubject的访问(通常是由于创建RealSubject的操作开销很大,需要延迟创建);
- protection proxy:对RealSubject的访问者进行权限检查,以保护RealSubject(常见的就是拦截器);
- Subject
- 为Proxy和RealSubject定义共同的接口,以便于在RealProxy能适用的地方,Proxy都能将其替换。
- RealSubject
- 被代理对象,实际的操作的执行者。
例子
public interface ISubject {
void request();
}
public abstract class AbstractProxy implements ISubject {
}
public class Proxy extends AbstractProxy {
ISubject realSubject = new RealSubject();
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("Proxy : [before access to realSubject]");
realSubject.request();
System.out.println("Proxy: [after access to realSubject]");
}
}
public class RealSubject implements ISubject {
@Override
public void request() {
// TODO Auto-generated method stub
System.out.println("RealSubject: [RealSubject request()]");
}
}
客户端代码:
public class ProxyDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
ISubject subject = new Proxy();//client依赖proxy,没有直接和RealSubject产生依赖
subject.request();
}
}
输出
Proxy : [before access to realSubject]
RealSubject: [RealSubject request()]
Proxy: [after access to realSubject]
应用
- Spring AOP
- Java CORBA和RMI 的 Stub 和 Skeleton
References
- 《设计模式:可复用面向对象软件的基础》