设计模式-代理

  1. 意图
  2. 适用性
  3. 结构
  4. 协作
  5. 效果

意图

为其他对象提供一种代理以控制对这个对象的访问。

适用性

  1. 远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代理。
  2. 虚拟代理(Virtual Proxy)根据需要创建开销很大的对象。
  3. 保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
  4. 智能指引(Smart Reference)取代了简单的指针,他在访问对象时执行一些附加操作。典型用途包括:
    • 对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放他。
    • 当第一次引用一个持久对象时,将它装入内存。
    • 在访问一个实际对象前,检查是否已经锁定了他,以确保其他对象不能改变它。

结构

github

协作

代理根据其种类,在适当的时候向 RealSubject 转发请求。

效果

Proxy模式在访问对象时引入了一定程度的间接性。根据代理的类型,附加的间接性有多种用途:

  1. RemoteProxy 可以隐藏一个对象存在于不同地址空间的事实。
  2. Virtual Proxy 可以进行最优化,例如根据要求创建对象。
  3. Protection Proxies和Smart Reference都允许在访问一个对象时有一些附加的内务处理

Proxy 模式还可以对用户隐藏另一种称之为 copy-on-write的优化方式,该优化与根据需要创建对象有关。拷贝一个庞大而复杂的对象是一种开销很大的操作,如果这个拷贝根本没有被修改,那么这些开销就没有必要。用代理延迟这一拷贝过程,我们可以保证只有当这个对象被修改的时候才对它进行拷贝。
在实现 Copy-on-write 时必须对实体进行引用计数。拷贝代理仅会增加引用计数。只有当用户请求一个修改该实体的操作时,代理才会真正的拷贝它。在这种情况下,代理还必须减少实体的引用计数。当引用的数目为零时,这个实体将被删除。
Copy-on-Write可以大幅度的降低拷贝庞大实体时的开销。