代理模式在所需对象和用户代码之间增加了一层对象,这个对象被称为代理。用户代码只需要直接操作代理对象即可。代理模式的UML图如下:
著名的代理模式的例子就是引用计数指针对象,它使得我们对真实对象的操作都需要经过引用计数指针对象。下面是用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章