设计模式C++学习笔记之二(Proxy代理模式)
来源:互联网 发布:类似江南布衣淘宝店 编辑:程序博客网 时间:2024/06/14 04:19
转自: http://www.cnblogs.com/wanggary/archive/2011/04/08/2009965.html
代理,一看名字就知道这只是个中介而已,真实的执行者在代理的后面呢。cbf4life在他的书里提的例子也很有趣,更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。现在贴代码,以方便随用随取。
2.1.解释
main(),西门庆
IKindWomen,接口
CWangPo,代理
CPanJinLian,实际执行者之一
CJiaShi,实际执行者之二
说明:代理和实际执行者派生于共同的接口,代理拥有实际执行者的实例。代理的每一个函数(接口的实现函数),直接调用实际执行者的对应接口函数。
注意:代理只是简单的装载,然后调用实际执行者的函数。
看代码:
/**
* 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
*/
//IKindWomen.h
#pragma onceclass IKindWomen{public: IKindWomen(void); virtual ~IKindWomen(void); //这种类型的女人能做什么事情呢? virtual void MakeEyesWithMan() = 0; // 抛媚眼 virtual void HappyWithMan() = 0; // happy what ? you know what!};
/**
* 再定一个丑陋的王婆
* 王婆这个人老聪明了,她太老了,是个男人都看不上,
* 但是她有智慧有经验啊,她作为一类女人的代理!
*/
//WangPo.h
#pragma once#include "ikindwomen.h"class CWangPo : public IKindWomen{public: CWangPo(IKindWomen *pKindWomen); ~CWangPo(void); void HappyWithMan(void); void MakeEyesWithMan(void);private: IKindWomen *m_pKindWomen;};
//WangPo.cpp
#include "StdAfx.h"#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();}
/ **
* 定一个潘金莲是什么样的人
*/
//PanJinLian.h
#pragma once#include "ikindwomen.h"class CPanJinLian : public IKindWomen{public: CPanJinLian(void); ~CPanJinLian(void); void HappyWithMan(void); void MakeEyesWithMan(void);};
//PanJinLian.cpp
#include "StdAfx.h"#include "PanJinLian.h"#include <iostream>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.h
/ **
* 那这就是活生生的一个例子,通过代理人实现了某种目的,如果真去掉王婆这个中间环节,直接是西门庆和潘金莲勾搭,
* 估计很难成就武松杀嫂事件。
* 那我们再考虑一下,水浒里还有没有这类型的女人?有,卢俊义的老婆贾氏(就是和那个固管家苟合的那个),那我们也让王婆做她的代理
*/
#pragma once#include "ikindwomen.h"class CJiaShi : public IKindWomen{public: CJiaShi(void); ~CJiaShi(void); void HappyWithMan(void); void MakeEyesWithMan(void);};
//JiaShi.cpp
#include "StdAfx.h"#include "JiaShi.h"#include <iostream>using std::cout;using std::endl;CJiaShi::CJiaShi(void){}CJiaShi::~CJiaShi(void){}void CJiaShi::HappyWithMan(void){ cout << " 贾氏和男人做那个... ... " << endl;}void CJiaShi::MakeEyesWithMan(void){ cout << " 贾氏抛媚眼 " << endl;}
//Proxy.cpp
#include "stdafx.h"#include "WangPo.h"#include "PanJinLian.h"#include "JiaShi.h"#include <iostream>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 _tmain(int argc, _TCHAR* argv[]){ // 西门庆想找潘金莲 DoPanJinLian(); // 西门庆想找贾氏 DoJiaShi(); _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF); _CrtDumpMemoryLeaks(); system("pause"); return 0;}
看起来代理模式的结构和策略模式类似,都是由一个类来装载接口的一个实例,策略模式是CContext来装载,代理模式是CWangPo来装载。CContext不是从IStrategy派生,所以不需要实现IStrategy接口函数,而CWangPo是从IKindWomen派生的所以CWangPo很清楚CPanJinLian和CJiaShi的接口函数。这就是代理,代理人知道被代理人能干的事情即函数,所以代理人可以成为中介。
代理模式可以很好的将前后端分开,实现了松散耦合。代理模式属于结构型模式。上图仍然是例子中用到的类相关图,并不是代理模式的抽象类图。这样的类图更容易理解代理模式。抽象类图当然具有更高的抽象层次,但不利于理解。
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- [设计模式学习笔记]PROXY(代理)
- 设计模式学习笔记(五)之代理模式(Proxy)
- 设计模式学习笔记--代理(Proxy)模式
- 设计模式C++之二(Proxy代理模式)
- 设计模式之(二)---代理模式Proxy Pattern
- 创建新的domain
- 简单的CST 时间转换 为常用时间格式
- 编译class文件“$”符号的含义
- chmod命令基本篇
- Java 多线程
- 设计模式C++学习笔记之二(Proxy代理模式)
- Android 用户定位
- HTML5——本地资源拖放
- 图文混排
- Android 之动态代理
- 链接时候提示undefined reference
- 设计模式C++学习笔记之三(Singleton单例模式)
- C++作业5
- Python 主要模块和常用方法简览