標籤:簡單 app leaks ++ happy 代理模式 use let 內容
代理,一看名字就知道這隻是個中介而已,真實的執行者在代理的後面呢。cbf4life在他的書裡提的例子也很有趣,更詳細的內容及說明可以參考原作者部落格:cbf4life.cnblogs.com。現在貼代碼,以方便隨用隨取。
2.1.解釋
main(),西門慶
IKindWomen,介面
CWangPo,代理
CPanJinLian,實際執行者之一
CJiaShi,實際執行者之二
說明:代理和實際執行者派生於共同的介面,代理擁有實際執行者的執行個體。代理的每一個函數(介面的實現函數),直接調用實際執行者的對應介面函數。
注意:代理只是簡單的裝載,然後調用實際執行者的函數。
看代碼:
//IKindWomen.h
#pragma once
class IKindWomen
{
public:
IKindWomen(void);
virtual ~IKindWomen(void);
virtual void MakeEyesWithMan() = 0;
virtual void HappyWithMan() = 0;
};
//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代理模式)