
描述
定义
代理模式为目标对象提供一种代理以控制对目标对象的访问,又叫Proxy或Surrogate。
类型
对象结构型模式
动机
对一个对象进行访问控制。
UML类图
时序图
实现
主要角色
- Proxy:代理类
- 保存一个实体引用使得代理可以访问实体;
- 提供一个与实体类接口相同的接口,这样代理就可以用来替代实体;
- 控制对实体的访问,并可能负责创建和删除它;
- 其他功能依赖于代理的类型:
- Remote Proxy负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求;
- Virtual Proxy可以缓存实体的附加信息,以便延迟对它的访问。
- Protection Proxy检查调用者是否具有实现一个请求所必需的访问权限。
- Subject:共用接口类,RealSubject和Proxy的共用接口,这样就可以在任何使用RealSubject的地方使用Proxy。
- RealSubject:Proxy所代理的具体实体类。
示例
-
Subject:共用接口类
interface Subject { void request(); }
-
RealSubject:具体实体类
public class RealSubject implements Subject { public void request() { System.out.println("From real subject"); } }
-
Proxy:代理类,在调用实体对象的request()前后,Proxy可以进行一些其他处理操作。
public class Proxy implements Subject { private RealSubject realSubject; public void request() { preRequest(); if(realSubject == null) { realSubject = new RealSubject(); } realSubject.request(); postRequest(); } //请求前的操作 private void preRequest() { //something you want to do before requesting } //请求后的操作 private void postRequest() { //something you want to do after requesting } }
-
Client:客户类
public class Client { public static void main(String[] args) { Subject subject = new Proxy(); subject.request(); } }
适用场景
- 远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表。
- 隐藏一个对象存在于不同地址空间的事实,像访问本地对象一样访问远程对象;
- 远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求;
- 虚代理(Virtual Proxy)延迟加载大对象,在必要的时候才加载被代理的对象,减少系统的开销。
- 保护代理(Protection Proxy)控制对原始对象的访问,可以在运行时进行权限检查。
- 智能指针(Smart Reference)取代简单的指针,可以在访问对象时执行一些内务处理(Housekeeping)操作,比如:引用计数、单例、锁等。
- 对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它(也称为Smart Pointers);
- 当第一次引用一个持久对象时,将它装入内存;
- 在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它;
优点
- 在客户端和目标对象之间增加代理中介,降低了系统的耦合度;
- 代理类与实体类共用对外接口,对客户端无感知;
- 可以控制对目标对象的访问,起到了保护目标对象的作用;
- 远程代理使得客户端可以像访问本地对象一样访问在远程机器上的对象;
- 虚拟代理可以在实际使用时才加载目标对象;
缺点
- 由于在客户端和目标对象之间增加了代理对象,因此可能会使请求的处理速度变慢;
- 实现代理模式可能会增加系统的复杂度;
相关模式
- Adapter:适配器Adapter为它所适配的对象提供了一个不同的接口。相反,代理提供了与它的实体相同的接口。
- Decorator:尽管decorator的实现部分与代理相似,但decorator的目的是为对象添加一个或多个功能,而代理则是控制对对象的访问。