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

学习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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值