Decorator模式C++实现

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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值