案例:星巴克咖啡销售系统
饮料由 原料(咖啡) 和 调料(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;
}