【6】设计模式之代理模式(Proxy)

1、描述

代理模式:为其他对象提供一种代理,并以控制对象的访问。非常简单。

2、示例

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

工程目录:

注释:

main(),西门庆

IKindWomen,定义接口

CWangPo,代理

CPanJinLian,实际执行者之一

CJiaShi,实际执行者之二

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

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

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

IKindWomen
//IKindWomen.h
#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()
{
    
}
CPanJinLian::~CPanJinLian()
{
    
}

void CPanJinLian::HappyWithMan()
{
    cout << "潘金莲喜欢OOXX" << endl;
}
void CPanJinLian::MakeEyesWithMan()
{
    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 << " 贾氏也喜欢OOXX" << endl;
}

void CJiaShi::MakeEyesWithMan(void)
{
    cout << " 贾氏抛媚眼 " << endl;
}
Proxy-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.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[]) {
    // insert code here...
    
    // 西门庆想找潘金莲
    cout<<"********西门庆想找潘金莲*********"<<endl;
    DoPanJinLian();
    
    
    // 西门庆想找贾氏
    cout<<"********西门庆想找贾氏*********"<<endl;
    DoJiaShi();

    std::cout << "Hello, World!\n";
    return 0;
}

3、运行结果




参考资料:http://blog.csdn.net/rexuefengye/article/details/12704821,感谢热血枫叶博主的精彩博文。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值