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();
}
- 不难看出,用装饰模式写出的这个系统,一旦我们要增加一款调料也好,增加一个咖啡也好,基本上只用增加类就可以了,而且在主函数里的调用代码也是一目了然
- c++学习笔记,面向对象设计模式,装饰者模式
- C#面向对象设计模式纵横谈 学习笔记10 Decorator 装饰(结构型模式)
- 设计模式-装饰者模式学习笔记
- <设计模式可复用面向对象软件的基础> [2.4]、装饰者模式(C#)
- 设计模式学习笔记-装饰模式
- 设计模式学习笔记--装饰(Decorator)模式
- 设计模式--装饰模式学习笔记
- 设计模式学习笔记--装饰模式
- [设计模式学习笔记]DECORATOR装饰模式
- 设计模式学习笔记-装饰模式
- 设计模式学习笔记之装饰模式
- 设计模式学习笔记--装饰器模式
- 面向对象设计模式之Composite组合模式学习笔记
- 设计模式学习笔记十(Decorator装饰者模式)
- 【设计模式】学习笔记3:装饰者模式(Decorator )
- 设计模式---装饰者模式(学习笔记)
- C++设计模式学习笔记二:装饰者模式
- 设计模式学习笔记之装饰者模式
- 使用node.js搭建简易的个人博客(一)
- 第八讲 拦截器
- 深入探讨array_map、foreach、for循环处理数组的效率
- 小小白爬虫入门——selenium模拟登录qq空间
- 原生js封装jquery
- c++学习笔记,面向对象设计模式,装饰者模式
- HeadFirstJava 11异常处理
- 蓝桥杯 摆动序列
- [LeetCode 解题报告]008.String to Integer (atoi)
- Error:Cannot find module 'stylus'
- codevs 1214 线段覆盖(贪心 or dp)
- 1、intellij idea 常用快捷键 加快开发速度
- L
- ACM International Collegiate Programming H.动态规划