说明:将《Head First 设计模式》装饰者模式,用C++实现。
咖啡及调料类Behaverage.h:
#pragma once
#include <iostream>
using namespace std;
//咖啡类
class IBehaverage
{
public:
virtual ~IBehaverage(){}
virtual CString GetDescription()
{
return m_strDesc;
}
virtual double Cost() = 0;
protected:
CString m_strDesc;
};
class CEspresso : public IBehaverage
{
public:
CEspresso()
{
m_strDesc = _T("Espresso");
}
double Cost()
{
return 1.99;
}
};
class CHouseBlend : public IBehaverage
{
public:
CHouseBlend()
{
m_strDesc = _T("House Blend Coffee");
}
double Cost()
{
return 0.89;
}
};
//调料类
class ICondimentDecorator : public IBehaverage
{
public:
virtual CString GetDescription() = 0;
};
//摩卡
class CMocha : public ICondimentDecorator
{
public:
CMocha(IBehaverage* pBehav)
{
m_pBehav = pBehav;
}
~CMocha()
{
if (m_pBehav != NULL)
{
delete m_pBehav;
m_pBehav = NULL;
}
}
CString GetDescription()
{
return m_pBehav->GetDescription() + _T(", Mocha");
}
double Cost()
{
return m_pBehav->Cost() + 0.20;
}
private:
IBehaverage* m_pBehav;
};
class CWhip : public ICondimentDecorator
{
public:
CWhip(IBehaverage* pBehav)
{
m_pBehav = pBehav;
}
~CWhip()
{
if (m_pBehav != NULL)
{
delete m_pBehav;
m_pBehav = NULL;
}
}
CString GetDescription()
{
return m_pBehav->GetDescription() + _T(", Whip");
}
double Cost()
{
return m_pBehav->Cost() + 0.10;
}
private:
IBehaverage* m_pBehav;
};
调用方法:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
return 1;
}
IBehaverage* pBehav = new CEspresso();
pBehav = new CMocha(pBehav);
pBehav = new CMocha(pBehav);
pBehav = new CWhip(pBehav);
cout<<pBehav->GetDescription()<<_T(" $")<<pBehav->Cost()<<endl;
delete pBehav;
pBehav = NULL;
return nRetCode;
}