结构型模式之装饰模式(Decorator Pattern)C++实现
来源:互联网 发布:淘宝可以买发票吗 编辑:程序博客网 时间:2024/05/19 20:56
装饰模式(Decorator Pattern)结构型模式.
设计原则:类应该对扩展开放,对修改关闭.
例子:用调料来装饰饮料。比如说顾客想要摩卡和奶泡深焙咖啡,那么要做的是:
1.拿一个深焙咖啡(DarkRoast)对象
2.以摩卡(Mocha)对象去装饰它
3.以奶泡(Whip)对象去装饰它
4.调用cost()方法,并依赖委托(delegate)将调料的价格加上去。
装饰着和被装饰者对象有相同的超类型(关键)。通过继承达到类型匹配而不是获取行为。可以用一个或多个装饰者包装一个对象。
定义:装饰者模式动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
HeadFirst中咖啡店的类图如下:
C++实现代码如下:
Component.h头文件:
#ifndef _COMPONENT_H_#define _COMPONENT_H_#include <string>using namespace std;//饮料抽象类class Beverage{public:virtual string getDescription();virtual double cost()=0;protected:string description;};//抽象装饰者调料类class CondimentDecorator:public Beverage{public:virtual string getDescription()=0;};//具体饮料,被装饰的对象class Espresso:public Beverage{public:Espresso();~Espresso();double cost();};class HouseBlend:public Beverage{public:HouseBlend();~HouseBlend();double cost();};//具体调料类class Mocha:public CondimentDecorator{public:Mocha(Beverage *beverage);string getDescription();double cost();private:Beverage *beverage; //记录被装饰者,即饮料};#endif
Component.CPP源文件
#include "Component.h"#include <iostream>#include <string>using namespace std;string Beverage::getDescription(){return description;}//被装饰者类HouseBlend::HouseBlend(){description="House Blend Coffee";}HouseBlend::~HouseBlend(){cout<<"~HouseBlend()"<<endl;}double HouseBlend::cost(){return 0.89;}Espresso::Espresso(){description="Espresso";}Espresso::~Espresso(){cout<<"~Espresso()"<<endl;}double Espresso::cost(){return 1.99;}//装饰者类Mocha::Mocha(Beverage *beverage){this->beverage=beverage;}string Mocha::getDescription(){return beverage->getDescription()+",Mocha";}double Mocha::cost(){return 0.20+beverage->cost();}
主函数main.CPP
#include "Component.h"#include <iostream>using namespace std;int main(int argc,char* argv[]){ //订一杯Espresso,不需要调料,并打印出描述及其价格 Beverage *beverage=new Espresso(); cout<<beverage->getDescription()<<" $"<<beverage->cost()<<endl; //订一杯HouseBlend并加入Mocha调料,打印出描述及其价格 Beverage *beverage2=new HouseBlend(); beverage2=new Mocha(beverage2); //用Mocha去装饰HouseBlend cout<<beverage2->getDescription()<<" $"<<beverage2->cost()<<endl;return 0;}
- 结构型模式之装饰模式(Decorator Pattern)C++实现
- 设计模式(结构型)之装饰者模式(Decorator Pattern)
- 结构型模式3:装饰模式(Decorator Pattern)
- 结构型模式: 装饰者模式(Decorator Pattern)
- 设计模式之装饰模式(Decorator Pattern)
- 设计模式之装饰模式--- Pattern Decorator
- "围观"设计模式(13)--结构型之装饰模式(Decorator Pattern)
- 【design pattern】结构型模式之—装饰者模式(Decorator)
- 结构型模式之装饰DECORATOR
- 结构型模式之装饰(Decorator)
- 装饰模式Decorator Pattern
- 装饰模式(Decorator Pattern)
- 装饰模式(Decorator Pattern)
- 装饰模式--Decorator pattern
- 装饰模式 Decorator Pattern
- 装饰模式【DECORATOR PATTERN 】
- 装饰模式【Decorator Pattern】
- decorator pattern -- 装饰模式
- error C2471: 无法更新程序数据库 vc90.pdb
- ARM中的总线
- 详解Android中的Parcelable
- 浅谈缓存
- iphone里读取gb2312(中文)编码文件或者二进制流。
- 结构型模式之装饰模式(Decorator Pattern)C++实现
- Hibernate中对象的三种状态
- shell中常用符号
- 语不惊人死不罢休
- 获取iPhone屏幕的大小
- iReport学习笔记
- Spring入门Blog[十四、Spring中hibernateTemplate的使用]
- Linux设备驱动之I2C架构分析
- 程序员出入在那里