一、概述
为其他对象提供一种代理以控制对这个对象的访问。代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。它使得客户不能直接与真正的目标对象通信。代理对象是目标对象的代表,其他需要与这个目标对象打交道的操作都是和这个代理对象在交涉。代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的,同时也在一定程度上面减少了系统的耦合度。
二、使用场景
1.远程访问:为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
2.虚拟代理:根据需求创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
3.安全代理:用来控制真实对象访问时的权限。
4.智能指引:调用真实的对象时,代理处置另外一些事。
三、参与者
1.Proxy 保存一个引用使得代理可以访问实体。若RealSubject和Subject的接口相同,Proxy会引用Subject。 提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。 控制对实体的存取,并可能负责创建和删除它。 其他功能依赖于代理的类型:
2.RemoteProxy负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求。
3.VirtualProxy可以缓存实体的附加信息,以便延迟对它的访问。
4.ProtectionProxy检查调用者是否具有实现一个请求所必需的访问权限。
5.Subject 定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
6.RealSubject 定义Proxy所代表的实体。
四、类图
五、代码示例
1.Subject:
/**
* Subject
* @author zhipeng_Tong
*/
public interface Subject {
void active();
}
2.RealSubject:
/**
* RealSubject
* @author zhipeng_Tong
*/
public class RealSubject implements Subject {
@Override
public void active() {
System.out.println("------------------------");
System.out.println("被代理类 RealSubject....");
System.out.println("------------------------");
}
}
3.Proxy:
/**
* Rroxy
* @author zhipeng_Tong
*/
public class Proxy implements Subject {
private Subject subject;
public Proxy() {
System.out.println("代理类 Proxy 被初始化...");
this.subject = new RealSubject();
}
@Override
public void active() {
System.out.println("代理开始");
subject.active();
System.out.println("代理结束");
}
}
4.测试代码
public class Client {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.active();
}
}
运行结果:
代理类 Proxy 被初始化...
代理开始
------------------------
被代理类 RealSubject....
------------------------
代理结束