c++学习笔记,面向对象设计模式,装饰者模式

来源:互联网 发布:xp系统cpu优化工具 编辑:程序博客网 时间:2024/06/02 02:14

学习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();

}


  • 不难看出,用装饰模式写出的这个系统,一旦我们要增加一款调料也好,增加一个咖啡也好,基本上只用增加类就可以了,而且在主函数里的调用代码也是一目了然
阅读全文
0 0
原创粉丝点击