首页 > 代码库 > 【设计模式】代理模式

【设计模式】代理模式

代理模式在所需对象和用户代码之间增加了一层对象,这个对象被称为代理。用户代码只需要直接操作代理对象即可。著名的代理模式的例子就是引用计数指针对象,它使得我们对真实对象的操作都需要经过引用计数指针对象。下面是用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类来输出相关信息。根据使用的场合可以把代理模式分成四类:

  1. 远程代理:为一个不在同一地址空间的对象提供局部代表。

  2. 虚拟代理:创建对象开销很大时,可用代理暂时代替真实对象。

  3. 安全代理:控制真实对象访问时的权限。

  4. 智能指引:当调用真实对象时,代理处理另外一些事情。智能指针就是这种类型的代理模式。

?参考:

《大话设计模式》第7章