C++代理模式

转载 2013年12月05日 15:49:13

文章链接 点击打开链接

由遇到的问题引出代理模式

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

模式选择

代理模式典型的结构图为:

图 2-1:代理模式结构图

实际上,代理模式的想法非常简单。

代理模式的实现

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

//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;
}
代码说明:代理模式的实现很简单,这里不做多余解释。

可以看到,示例代码运行后,p 的 Request 请求实际上是交给了 sub 来实际执行。

关于代理模式的讨论

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

最常用的设计模式---代理模式(C++实现)

代理模式:为其他对象提供一种代理以控制对这个对象的访问
  • lh844386434
  • lh844386434
  • 2014-01-09 17:23:17
  • 2334

设计模式之代理模式 c++实现以及详解

代理模式分为四类:远程代理,虚代理,保护代理和智能引用。
  • hnust_xiehonghao
  • hnust_xiehonghao
  • 2014-05-22 14:16:39
  • 3914

大话设计模式C++实现-第7章-代理模式

一、UML图 二、概念 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 三、应用场景 (1)远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间...
  • XD_lixin
  • XD_lixin
  • 2014-12-16 22:58:47
  • 1470

对代理模式和动态代理的理解

  代理模式代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式一般涉及到...
  • software_jianghai
  • software_jianghai
  • 2006-10-10 18:16:00
  • 1082

代理模式的简单例子

【代理模式应用场景举例】比如在玩“极品飞车”这款游戏,如果游戏者手中的金钱达到了一定的数量就可以到车店买一部性能更高的赛车,那么这个卖车的“车店”就是一个典型的“汽车厂家”的“代理”,他为汽车厂家“提...
  • lishaojun0115
  • lishaojun0115
  • 2016-02-26 11:51:23
  • 1840

C++设计模式::装饰模式or代理模式or面向切片编程(AOP)

一个实例 装饰模式:动态地给一个对象(而非一个类)添加一些额外的职责。就增加功能来说,装饰模式比创建子类更加灵活,因为有时我们的需求是给某个对象而不是整个类添加一些功能,比如为一部手机添加增加挂...
  • lanchunhui
  • lanchunhui
  • 2015-11-20 21:16:03
  • 1460

设计模式_代理模式

  • 2012年10月15日 16:29
  • 22KB
  • 下载

代理模式 C++实现

  • 2009年10月03日 01:19
  • 631KB
  • 下载

六 设计模式之代理模式(或称委托模式)

定义   为其它对象提供一种代理以控制对这个对象的访问类图通用代码 抽象主题类 public interface Subject { public void request(); } 真实主...
  • guojun828
  • guojun828
  • 2011-01-20 23:26:00
  • 7465

Cocos网络访问——代理模式(2)

注:本文为作者原创,其中知识内容出自闪电终结者的视频课程首先要强调一点,因为网络访问与Cocos的线程是不同的,网络访问需要自己的子线程(网络请求是需要时间的),所以在写代码时候无法将发生请求和请求数...
  • amy260231120
  • amy260231120
  • 2016-08-05 22:20:48
  • 438
收藏助手
不良信息举报
您举报文章:C++代理模式
举报原因:
原因补充:

(最多只允许输入30个字)