结构型模式--Proxy模式(代理)
一. 意图
为其他对象提供一种代理以控制对这个对象的访问.
二. 适用性
在需要用比较通用和复杂的对象指针代替简单的指针的时候, 使用Proxy模式.
下面是一些可以使用P r o x y模式常见情况:
1. 远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表.
2. 虚代理(Virtual Proxy)根据需要创建开销很大的对象.
3. 保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候.
4. 智能指引(Smart Reference)取代了简单的指针, 它在访问对象时执行一些附加操作(智能指针).
(智能指针的功能有: 自动创建/销毁, 引用计数, 检查锁定)
三. 模式结构
图1
四. 角色说明
Proxy
—保存一个引用使得代理可以访问实体。若RealSubject和Subject的接口相同, Proxy会引用Subject。
—提供一个与Subject的接口相同的接口, 这样代理就可以用来替代实体.
—控制对实体的存取, 并可能负责创建和删除它.
—其他功能依赖于代理的类型:
RemoteProxy负责对请求及其参数进行编码, 并向不同地址空间中的实体发送已编码的请求.
VirtualProxy可以缓存实体的附加信息, 以便延迟对它的访问.
ProtectionProxy检查调用者是否具有实现一个请求所必需的访问权限.
Subject
—定义RealSubject和Proxy的共用接口, 这样就在任何使用RealSubject的地方都可以使用Proxy.
RealSubject
—定义Proxy所代表的实体。
Client
Abstraction将Client的请求转发给它的Implementor对象.
五. 说明
Proxy并不总是需要知道实体的类型, 若Proxy类能够完全通过一个抽象接口处理它的实体, 则无须为每一个RealSubject类都生成一个Proxy类:Proxy可以统一处理所有的RealSubject类. 但是如果Proxy要实例化RealSubjects (例如在virtual proxy中),那么它们必须知道具体的类。
六. 我的理解
1. Proxy比较简单, 相当于就是在一个对象前加多一层, 这一层对于客户来说是透明的.
2. 例如在需要调用某对象的某方法前, 必须要进行一些繁琐的判断, 而当这个方法在很多地方被使用时, 那么我们可以使用一个代理类把该对象代理, 在代理中调用对象的方法时做一些判断等. 又例如 智能指针.
3. 为了对用户的透明性, 代理类需要实现对象的被代理的函数.(通过继承相同的父类实现).
七. 相关模式
Adapter: 适配器Adapter为它所适配的对象提供了一个不同的接口. 相反, 代理提供了与它的实体相同的接口. 然而, 用于访问保护的代理可能会拒绝执行实体会执行的操作, 因此,它的接口实际上可能只是实体接口的一个子集. (个人认为也不能那么死板吧, 在Adapter模式中我也可以拒绝执行实体会执行的操作吧, 就看你的需求而已.)
Decorator:尽管decorator的实现部分与代理相似, 但decorator的目的不一样, Decorator为对象添加一个或多个功能, 而代理则控制对对象的访问. 代理的实现与decorator的实现类似, 但是在相似的程度上有所差别. Protection Proxy的实现可能与decorator的实现差不多. 另一方面,Remote Proxy不包含对实体的直接引用, 而只是一个间接引用, 如"主机ID, 主机上的局部地址”. Virtual Proxy开始的时候使用一个间接引用, 例如一个文件名, 但最终将获取并使用一个直接引用.
个人理解: 在这些模式中, 都有一个相似性, 就是都是包含了一个对象的引用或者实体, 用户不直接调用对象, 而是过这些模式中的对应类间接调用对象, 通过这样的间接调用, 在调用对象的方法前后可以做一些事情.(当然, 不做也可以) 虽然他们的目的是不一样的.