委托设计模式(即代理模式)

来源:互联网 发布:seo工程师考证 编辑:程序博客网 时间:2024/04/30 11:31

问题

至少在以下集中情况下可以用 Proxy 模式解决问题:
1)创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成, GoF 称之为虚代理(Virtual Proxy);
2)为网络上的对象创建一个局部的本地代理, 比如要操作一个网络上的一个对象(网络性能不好的时候,问题尤其突出),我们将这个操纵的过程交给一个代理去完成, GoF 称之为远程代理(Remote Proxy);
3) 对对象进行控制访问的时候, 比如在 Jive 论坛中不同权限的用户(如管理员、 普通用户等) 将获得不同层次的操作权限, 我们将这个工作交给一个代理去完成, GoF 称之为保护代理(Protection Proxy)。
4) 智能指针(Smart Pointer), 关于这个方面的内容, 建议参看 Andrew Koenig 的《C++沉思录》中的第 5 章。
模式选择
Proxy 模式典型的结构图为:
这里写图片描述
图 2-1: Proxy Pattern 结构图
实际上, Proxy 模式的想法非常简单,

实现

完整代码示例(code)
Proxy 模式的实现很简单, 这里为了方便初学者的学习和参考, 将给出完整的实现代码(所有代码采用 C++实现,并在 VC 6.0 下测试运行)。
代码片断 1: Proxy.h

//Proxy.h#ifndef _PROXY_H_#define _PROXY_H_class Subject{public:    virtual ~Subject();    virtual void Request() = 0;protected:    Subject();private:};class ConcreteSubject:public Subject{public:    ConcreteSubject();    ~ConcreteSubject();    void Request();protected:private:};class Proxy{public:    Proxy();    Proxy(Subject* sub);    ~Proxy();    void Request();protected:private:    Subject* _sub;};#endif //~_PROXY_H_

代码片断 2: Proxy.cpp

//Proxy.cpp#include "Proxy.h"#include <iostream>using namespace std;Subject::Subject(){}Subject::~Subject(){}ConcreteSubject::ConcreteSubject(){}ConcreteSubject::~ConcreteSubject(){}void ConcreteSubject::Request(){    cout<<"ConcreteSubject......request...."<<endl;}Proxy::Proxy(){}Proxy::Proxy(Subject* sub){    _sub = sub;}Proxy::~Proxy(){    delete _sub;}void Proxy::Request(){    cout<<"Proxy request...."<<endl;    _sub->Request();}

代码片断 3: main.cpp

//main.cpp#include "Proxy.h"#include <iostream>using namespace std;int main(int argc,char* argv[]){    Subject* sub = new ConcreteSubject();    Proxy* p = new Proxy(sub);    p->Request();    return 0;}

代码说明

Proxy 模式的实现很简单,这里不做多余解释。
可以看到,示例代码运行后, p 的 Request 请求实际上是交给了 sub 来实际执行。

讨论

Proxy 模式最大的好处就是实现了逻辑和实现的彻底解耦。

原创粉丝点击