代理模式在所需对象和用户代码之间增加了一层对象,这个对象被称为代理。用户代码只需要直接操作代理对象即可。著名的代理模式的例子就是引用计数指针对象,它使得我们对真实对象的操作都需要经过引用计数指针对象。下面是用C++写的一个运用了代理模式的例子。
#include <iostream> #include <string> using namespace std; // 作为接口的抽象基类 class Subject { public: virtual void DoAction() = 0; }; // 被代理对象 class RealSubject : public Subject { public: RealSubject(const string &str) : info(str) {} // 被代理对象所做的动作 void DoAction() { cout << info << endl; } private: string info; // 被代理对象需要输出的内容 }; // 作为代理的对象 class Proxy : public Subject { public: Proxy(const string &str = "") : realSubject(str) {} void DoAction() { realSubject.DoAction(); // 代理所做的动作实际上是被代理对象所需要做的事情 } private: RealSubject realSubject; // 保存需要被代理的对象 }; int main() { Proxy proxy("test"); proxy.DoAction(); // 用户代码只和代理有联系 system("pause"); return 0; }
上面的例子展示了代理模式的基本框架。用户代码通过代理类Proxy而不是RealSubject类来输出相关信息。根据使用的场合可以把代理模式分成四类:
远程代理:为一个不在同一地址空间的对象提供局部代表。
虚拟代理:创建对象开销很大时,可用代理暂时代替真实对象。
安全代理:控制真实对象访问时的权限。
智能指引:当调用真实对象时,代理处理另外一些事情。智能指针就是这种类型的代理模式。
?参考:
《大话设计模式》第7章
原文地址:http://blog.csdn.net/nestler/article/details/38022325