学习C++设计模式:装饰模式 笔记
装饰模式主要是想在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
这个例子说的是,假如做一个咖啡店的收银系统,顾客可能单点咖啡,也可能要在咖啡里面加调料,如果将调料在咖啡里写死,显而易见的到时候会在咖啡里维护一个调料的数组,可是这样,假如要增加一种新的调料,那就会动原来写好的代码了,这样倘若是个小程序倒无所谓,一旦工程量大了,这种设计绝对会是致命的,为了满足开闭原则,所以使用了装饰模式
这是一个headfirst 设计模式里的例子,笔者在这儿用C++将他实现了
include “iostream”
include “string”
using namespace std;
class Beverage//饮料类
{
public:
virtual string Describe()=0;
virtual float Cost() = 0;
};
class Espresso:public Beverage//浓缩咖啡
{
public:
string Describe()
{
return “浓缩咖啡”;
}
float Cost() { return 1.0; }
};
class Blend :public Beverage//混合咖啡
{
public:
string Describe()
{
return “混合咖啡”;
}
float Cost() { return 2.0; }
};
class Decoration :public Beverage//调料类
{
protected:
Beverage *b;
public:
Decoration (Beverage *bb) :b(bb) {}
};
class Mike :public Decoration//牛奶类
{
public:
Mike(Beverage *bb) :Decoration(bb) {}
string Describe()
{
return b->Describe()+”+牛奶”;
}
float Cost() { return b->Cost() +0.2; }
};
class Mocha :public Decoration//摩卡类
{
public:
Mocha(Beverage *bb) :Decoration(bb) {}
string Describe()
{
return b->Describe() + “+摩卡”;
}
float Cost() { return b->Cost() + 0.3; }
};
void main()
{
Beverage *b = new Blend;
cout << b->Describe() << ":" << b->Cost() << "元"<<endl;
Mike *m = new Mike(b);
cout << m->Describe() << ":" << m->Cost() << "元" << endl;
Mocha *mm = new Mocha(m);
mm = new Mocha(mm);
cout << mm->Describe() << ":" << mm->Cost() << "元" << endl;
getchar();
}
- 不难看出,用装饰模式写出的这个系统,一旦我们要增加一款调料也好,增加一个咖啡也好,基本上只用增加类就可以了,而且在主函数里的调用代码也是一目了然