意图
为其他对象提供一种代理以控制对这个对象的访问。
适用性
- 远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代理。
- 虚拟代理(Virtual Proxy)根据需要创建开销很大的对象。
- 保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
- 智能指引(Smart Reference)取代了简单的指针,他在访问对象时执行一些附加操作。典型用途包括:
- 对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放他。
- 当第一次引用一个持久对象时,将它装入内存。
- 在访问一个实际对象前,检查是否已经锁定了他,以确保其他对象不能改变它。
结构
协作
代理根据其种类,在适当的时候向 RealSubject 转发请求。
效果
Proxy模式在访问对象时引入了一定程度的间接性。根据代理的类型,附加的间接性有多种用途:
- RemoteProxy 可以隐藏一个对象存在于不同地址空间的事实。
- Virtual Proxy 可以进行最优化,例如根据要求创建对象。
- Protection Proxies和Smart Reference都允许在访问一个对象时有一些附加的内务处理
Proxy 模式还可以对用户隐藏另一种称之为 copy-on-write的优化方式,该优化与根据需要创建对象有关。拷贝一个庞大而复杂的对象是一种开销很大的操作,如果这个拷贝根本没有被修改,那么这些开销就没有必要。用代理延迟这一拷贝过程,我们可以保证只有当这个对象被修改的时候才对它进行拷贝。
在实现 Copy-on-write 时必须对实体进行引用计数。拷贝代理仅会增加引用计数。只有当用户请求一个修改该实体的操作时,代理才会真正的拷贝它。在这种情况下,代理还必须减少实体的引用计数。当引用的数目为零时,这个实体将被删除。
Copy-on-Write可以大幅度的降低拷贝庞大实体时的开销。