动机: 在面向对象系统中,有些对对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等)直接访问会给使用者、或者系统结构带来麻烦。
适用性:
远程代理为对象在不同地址空间提供局部代表;
虚代理根据需要创建开销来那个很大的对象
保护代理控制对原始对象的访问;
智能指针取代了简单的指针,它在访问对象时添加了一些附加操作
结构:
参与者:
Proxy:保存一个引用使得代理可以访问实体;提供一个与subject的接口相同的接口;控制对实体的存取;其他功能依赖于代理的类型:
Remote Proxy;负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求。
Virtual Proxy : 可以缓存实体的附加信息,以便延迟对它的访问
Protection Proxy : 检查调用者是否具有实现一个请求所必需的访问权限
Subject: 定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方可以使用Proxy;
RealSubject : 定义proxy所代表的的实体
协作:
代理根据其种类,在适当的时候向RealSubject转发请求
效果:
Remote Proxy可以隐藏一个对象存在不同地址空间的事实
Virtual Proxy可以进行最优化,例如根据要求创建对象
Protection Proxy和Smart Reference都允许在访问一个对象时有一些附加的内务处理。
Proxy模式还可以隐藏一种称为copy-on-write的优化方式,该优化与根据需要创建对象有关。
实现:
代码示例如下:
1 |
|