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,感谢热血枫叶博主的精彩博文。