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为对象添加一个或多个功能,而代理则控制对对象的访问。