设计模式十三:proxy(代理)——对象结构型模式
proxy(代理)——对象结构型模式
1.意图
为其他对象提供一种代理以控制这个对象的访问
2.动机
对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。
3.适用性
在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用proxy模式
1)远程代理
为一个对象在不同的地址空间提供局部代表
2)虚代理
根据需要创建开销很大的对象
3)保护代理
控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
4)智能指引
取代了简单指针,在访问对象的时候执行一些附加的操作
4.结构
参考:http://www.cnblogs.com/rush/archive/2011/06/19/2084775.html
5.参与者
proxy
保存一个引用使得代理可以访问实体
提供一个subject的接口相同的接口,这样代理可以用来替代实体
控制对实体的存取,并可能负责创建和删除他
其他功能依赖于代理的类型:
远程代理负责对请求及其参数编码,并向不同地址空间中的实体发送已编码的请求
虚代理可以缓存实体的附加信息,一边延迟对它的访问
保护代理可以检查调用者是否具有实现一个请求所必须的访问权限。
subject
定义realSubject和Proxy的公用接口,这样就可以在任何使用realSubject的地方使用proxy
realSubject
定义proxy所代表的实体
6.协作
flyweight执行时所需的状态必定是内部的或者是外部的,内部状态存储于concreteflyweight对象之中,而外部对象则由client对象存储,当用户调用flyweight对象的操作时,将该状态传递给他。
用户不应该直接对concreteflyweight类进行实例化,二十只能从flyweightFactory对象得到concreteflyweight对象,这保证对他们适当的进行共享。
7.效果
在访问对象的时候引入了一定的间接性,根据代理类型不同而不同
远程代理可以隐藏一个对象存在于不同地址空间的事实
虚代理可以进行最优化
保护代理可以允许访问一个对象时有一些附加的内务处理
8.实现
重载c++中的存取运算符
重载->使你可以在撤销对一个对象的引用时,执行一些附加的操作。这一点可以实现某些种类的代理,代理的作用就像指针。
9.代码示例
#include<iostream> using namespace std; class subject { public: virtual void dosth(){} }; class realSubject:public subject { public: realSubject(string str) { name = str; } void dosth() { for(int i=0;i<10;i++) { cout<<"waiting "<<i<<" seconds....."<<endl; } cout<<getName()<<endl; } string getName() { return name; } private: string name; }; class proxy:public subject { public: proxy(realSubject *r) { rsub = r; } void dosth() { cout<<rsub->getName()<<endl; } private: realSubject *rsub; }; int main() { realSubject *r = new realSubject("a subject farrrrrrr away"); cout<<"without proxy"<<endl; r->dosth(); cout<<endl<<"with proxy"<<endl; proxy *p = new proxy(r); p->dosth(); }
10.相关模式
adapter:为他所适配的对象提供了一个不同的接口,相反,代理提供了和实体相同的接口。实际上应该只是实体接口的一个子集,因为有些操作会被拒绝。
decorator:为了增加一些功能,而代理是为了控制对象的访问。
浙公网安备 33010602011771号