设计模式——装饰者模式

案例:星巴克咖啡销售系统

        饮料由 原料(咖啡) 和 调料(Milk 、Mocha等)组成,价格由原料和调料的价格相加。原料有多种,调料也有多种,所有就有多种不同的组合。

设计:类爆炸式设计

问题:如果原料和调料增加,将使类的个数成指数增长。

装饰者模式设计:

代码:

#include <iostream>
#include <string.h>

using namespace std;

//饮料 = 调料 + 原料

//饮料基类
class Beverage
{
public:
virtual double cost() = 0;
};

//调料基类  —— 装饰者基类
class CondimentDecorator:public Beverage
{
public:
void setBeverage(Beverage* beverage)
{
this->beverage = beverage; //设置需要装饰的对象
}
    
virtual double cost()
{
return beverage->cost(); //在装饰好的对象中,添加装饰前对象的功能。
}
protected:
Beverage* beverage;
};

//一种咖啡 —— 被装饰者
class Espresso:public Beverage
{
public:
double cost()
{
return 1.99;
}
};

//另一种咖啡 —— 被装饰者
class HouseBlend:public Beverage
{
public: 
double cost()
{
return 0.89;
}
};

//一种调料 —— 装饰者
class Mocha:public CondimentDecorator
{
public:
double cost()
{
return 0.20 + CondimentDecorator::cost();
} 
};

//另一种调料 —— 装饰者
class Milk:public CondimentDecorator
{
public:
double cost()
{
return 0.50 + CondimentDecorator::cost();
}
};

void main()
{
//实例化一个需要被装饰的对象。
Espresso* esp = new Espresso;
      //装饰者
Mocha* mocha = new Mocha;
Milk* milk = new Milk;

//用mocha装饰它
mocha->setBeverage(esp);

//用milk装饰它
    milk->setBeverage(esp);

double total = milk->cost();

    printf("%f\n",total);
    delete esp;
    delete mocha;
    delete milk;

    return;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值