设计模式(c++)笔记之十二(Proxy模式)

一、描述

      

      代理模式: 为其他对象提供一种代理,并以控制对这个对象的访问。

      例子1:经典例子就是网络代理,你想访问facebook或者twitter ,如何绕过GFW,找个代理网站。

      例子2:可以调用远程代理处理一些操作如图:


设计模式(c++)笔记之十二(Proxy模式)_第1张图片



实用性:


      1) 远程代理(Remote  Proxy)为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)


      2) 虚拟代理(Virtual Proxy)根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。 


      3) 保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。


      4) 智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。


      5) Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。


Proxy 模式典型的结构图为: 


设计模式(c++)笔记之十二(Proxy模式)_第2张图片


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


二、实例


      什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀。
  比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,请看类图:




本人的目录:


            


注释:

main(),西门庆

IKindWomen,定义接口

CWangPo,代理

CPanJinLian,实际执行者之一

CJiaShi,实际执行者之二

说明:代理和实际执行者派生于共同的接口,代理拥有实际执行者的实例。代理的每一个函数(接口的实现函数),直接调用实际执行者的对应接口函数。

注意:代理只是简单的装载,然后调用实际执行者的函数。

先定义一种类型的女人:IKindWomen类

#ifndef Proxy_IKindWomen_h
#define Proxy_IKindWomen_h
class IKindWomen
{
public:
    IKindWomen(void){}
    virtual ~IKindWomen(void){}
    //这种类型的女人能做什么事情呢?
    virtual void MakeEyesWithMan() = 0; //抛媚眼
    virtual void HappyWithMan() = 0;  //happy what? You know that!
};


#endif

 (潘金莲):PanJinLian类

PanJinLian.h

#ifndef __Proxy__PanJinLian__
#define __Proxy__PanJinLian__

#include <iostream>
#include "IKindWomen.h"

class CPanJinLian:public IKindWomen
{
public:
    CPanJinLian(void);
    ~ CPanJinLian(void);
    void HappyWithMan(void);
    void MakeEyesWithMan(void);
};

#endif /* defined(__Proxy__PanJinLian__) */
PanJinLian.cpp

#include "PanJinLian.h"
using std::cout;
using std::endl;

CPanJinLian::CPanJinLian(void)
{
    
}

CPanJinLian::~CPanJinLian(void)
{
    
}

void CPanJinLian::HappyWithMan(void)
{
    cout << " 潘金莲和男人做那个... ... " << endl;
}

void CPanJinLian::MakeEyesWithMan(void)
{
    cout << " 潘金莲抛媚眼 " << endl;
}

贾氏:JiaShi

JiaShi.h

#ifndef __Proxy__JiaShi__
#define __Proxy__JiaShi__

#include <iostream>
#include "IKindWomen.h"

class CJiaShi:public IKindWomen {
public:
    CJiaShi(void);
    ~CJiaShi(void);
    void HappyWithMan(void);
    void MakeEyesWithMan(void);
};

#endif /* defined(__Proxy__JiaShi__) */
JiaShi.cpp

#include "JiaShi.h"
using std::cout;
using std::endl;

CJiaShi::CJiaShi(void)
{
    
}

CJiaShi::~CJiaShi(void)
{
    
}

void CJiaShi::HappyWithMan(void)
{
    cout << " 贾氏和男人做那个... ... " << endl;
}

void CJiaShi::MakeEyesWithMan(void)
{
    cout << " 贾氏抛媚眼 " << endl;
}

王婆:WangPo

WangPo.h

#ifndef __Proxy__WangPo__
#define __Proxy__WangPo__

#include <iostream>
#include "IKindWomen.h"
class CWangPo:public IKindWomen
{
public:
    CWangPo(IKindWomen *pKindWomen);
    ~CWangPo(void);
    void HappyWithMan(void);
    void MakeEyesWithMan(void);
private:
    IKindWomen *m_pKindWomen;
};

#endif /* defined(__Proxy__WangPo__) */
WangPo.cpp

#include "WangPo.h"
CWangPo::CWangPo(IKindWomen *pKindWomen)
{
    this->m_pKindWomen = pKindWomen;
}

CWangPo::~CWangPo(void)
{
    delete this->m_pKindWomen;
}

void CWangPo::HappyWithMan()
{
    this->m_pKindWomen->HappyWithMan();
}

void CWangPo::MakeEyesWithMan(void)
{
    this->m_pKindWomen->MakeEyesWithMan();
}

西门庆:main

main.cpp

#include <iostream>
#include "IKindWomen.h"
#include "WangPo.h"
#include "PanJinLian.h"
#include "JiaShi.h"
using std::cout;
using std::endl;

void DoPanJinLian()
{
    CWangPo *pWangPo;
    // 西门庆想找潘金莲,让王婆来安排。
    pWangPo = new CWangPo(new CPanJinLian());
    pWangPo->MakeEyesWithMan();
    pWangPo->HappyWithMan();
    delete pWangPo;
}

void DoJiaShi()
{
    CWangPo *pWangPo;
    // 西门庆想找贾氏,让王婆来安排。
    pWangPo = new CWangPo(new CJiaShi());
    pWangPo->MakeEyesWithMan();
    pWangPo->HappyWithMan();
    delete pWangPo;
}


int main(int argc, const char * argv[])
{
    // 西门庆想找潘金莲
    cout<<"********西门庆想找潘金莲*********"<<endl;
    DoPanJinLian();
    
    
    // 西门庆想找贾氏
     cout<<"********西门庆想找贾氏*********"<<endl;
    DoJiaShi();
    
    // insert code here...
    std::cout << "Hello, World!\n";
    return 0;
}

结果如下:


设计模式(c++)笔记之十二(Proxy模式)_第3张图片


参考文献:《设计模式之禅》,《GoF_23种设计模式解析》


参考博客:  http://www.cnblogs.com/wanggary/archive/2011/04/08/2009965.html    

   http://blog.csdn.net/hguisu/article/details/7542143

你可能感兴趣的:(设计模式,C++)