现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

Decorator模式C++实现

2012-08-21 05:52 工业·编程 ⁄ 共 1950字 ⁄ 字号 暂无评论

说明:将《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;
}

给我留言

留言无头像?