Proxy

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

2 别名:surrogate

3 动机:只有在确实需要这个对象时才创建和初始化。文档编辑器一个很大的图形对象,没必要一开始就创建。

4 适用性:

   需要用比较通用和复杂的对象指针代替简单的指针的时候,使用Proxy模式。

   1)远程代理 为一个对象在不同的地址空间提供局部代表

   2)虚代理 根据需要创建开销很大的对象。ImageProxy属于这种

   3)保护代理  控制对原始对象的访问。  访问保护

   4)智能指引 取代了简单的指针,访问对象时执行一些附加操作。用途:

       . 对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它。

       . 当第一次引用一个持久对象时,将它装入内存

       . 访问一个实际对象前,检查是否已经锁定了它,确保其他对象不能改变它。

5 参与者:

   . Proxy 

      保存一个引用使得代理可以访问实体。

      提供一个与Subject的接口相同的接口,代理可用来替代实体

      控制对实体的存取,可能负责创建和删除它

      其他功能依赖于代理的类型:

      . 远程代理 负责对请求及其参数进行编码,向不同地址空间中的实体发送已编码的请求。

      . 虚代理 缓存实体的附加信息,以便延迟对它的访问。

      . Protection Proxy检查调用者是否具有实现一个请求所必须的访问权限。

   . Subject

     定义RealSubject和Proxy的共用接口,在任何使用RealSubject的地方都可以使用Proxy。

   . RealSubject

     定义Proxy所代表的实体

6 协作:

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

7 效果:

   1)远程代理:隐藏一个对象存在于不同地址空间的事实。

   2)虚代理  可以进行最优化,根据需求创建对象

   3)保护代理和智能指针 附加内务处理

Proxy还可以隐藏另一种称之为写时复制的优化方式。代理延迟拷贝过程,只有修改的时候才拷贝。

   C++重载->和*运算法

   有些情况不能重载操作符,因为有些代理需要清楚地知道调用了哪个操作。

   在动机中处理虚代理时,图像在一个特定的时刻被装载——也就是在Draw操作被调用时——而不是在只要引用这个图像就装载它。

   重载访问操作符无法做这样的区分

   Proxy并不总是需要知道实体的类型

8 相关模式:

   Adapter:适配器为它所适配的对象提供了一个不同的接口。 代理提供的与实体相同的接口。

   尽管Decorator的实现部分与代理很像,decorator目的不一样。decorator为对象添加一个或多个功能,而代理则控制对对象的访问。

   

 

posted @ 2016-08-01 17:52  罗纳尔东  阅读(415)  评论(0编辑  收藏  举报