概述
代理模式(Proxy),为其他对象提供一种代理,以控制对这个对象的访问,是一种结构类型的设计模式。在具体的使用过程中,客户端必须通过代理类才能调用幕后的被代理类的方法,完成特定的交互目的。
代理模式的UML图大致如下
角色
代理模式中含有的角色为
1)抽象对象(subject)
定义了目标对象(real subject)及代理类对象(proxy)的共同接口,这样在任何使用目标对象的地方都可以使用代理对象。
2)目标对象(real subject)
定义了代理对象(proxy)所代表的真实实体。
3)代理对象(proxy)
保存一个引用,使得代理可以访问实体,并提供了一个与抽象对象的接口相同的接口,从而可以在任何时候操作目标对象;代理对象和目标对象具有统一的接口,以便可以再任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或者之后,执行某些操作,而非单纯的将调用传递给目标对象。
代码举例
/**
* 角色:抽象对象
*/
public interface Subject {
void request();
}
/**
* 角色:目标对象
*/
public class RealSubject implements Subject {
@Override
public void request() {
System.out.print("真实的请求");
}
}
/**
* 角色:代理对象
*/
public class Proxy implements Subject {
//声明一个RealSubject对象,以便调用其方法
private RealSubject realSubject;
@Override
public void request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
realSubject.request();
}
}
/**
* 客户端
*/
public class Main {
public static void main(String[] args){
Proxy proxy = new Proxy();
proxy.request();
}
}
应用场合
1)远程代理
为一个对象在不同的地址空间提供局部代表,这个样的话就可以隐藏一个对象存在于不同地址空间的试试。例如web service,我们在进行应用开发的时候,移动客户端只管调用web service进行数据交互等操作,而没有关心web service是如何提供服务的,这就是典型的远程代理。
2)虚拟代理
根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真是对象。听起来有点晦涩难懂,举个例子,就比如移动开发中的图片展示,我们经常会采用缩略图显示图像的大概信息,这样就不必任何地方都下载大的图片资源,只有在需要的时候开启大图的下载,那么这个缩略图就是原图的虚拟代理。
3)安全代理
控制真实对象的访问权限。一般应用于不同的对象对应不同的访问权限的时候。