c++实现装饰器模式
来源:互联网 发布:加油好男儿现状 知乎 编辑:程序博客网 时间:2024/06/08 04:38
一、定义
装饰器模式(DecoratorPattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。
使用情况:如果需要添加新功能,但又不想修改定义好的接口或者抽象类,此时适合用装饰模式。
应用场景举例:例如对于一个蛋糕Cake类,一开始是一个原始蛋糕模型,后面需要给蛋糕加工—加上奶油,加上巧克力,加上瓜子仁,加上水果,写上字等。等同于将原始蛋糕作为一个Cake类,我们给这个Cake类的对象作修饰,为了不破坏开放-封闭原则,也为了更好的拓展,我们不能直接在Cake这个类里修改,而应该做一个装饰器给这个蛋糕做装饰。
优点:
1、可以不用修改原有的接口,就可以实现新功能的添加
2、装饰者可以很方便的转换原有接口中的实现,可以给装饰者指定不同的ConcreteComponent实现不同的功能。
缺点:
1、复杂性增加,装饰者模式会导致许多小类的产生。
二、实现(参考网上代码)
component.h 这个文件描述原始对象和需要被装饰的对象
#ifndefCOMPONENT_H_#defineCOMPONENT_H_ #include<iostream> //定义一个原始的抽象类蛋糕,装饰器的功能是给蛋糕加上各种装饰,如奶油,巧克力,瓜子仁,水果等class Cake {public: virtual void showCake()=0; //表示该函数没有函数体,函数体在派生类里定义 virtual ~Cake() {}; std::string name;}; classConcreteCake : public Cake {public: ConcreteCake() { name = "原始蛋糕"; } void showCake() { std::cout <<name.c_str() << std::endl; }; virtual ~ConcreteCake() {};}; #endif
decorator.h文件描述具体的装饰器的类
#include"component.h" classCakeDecrator : public Cake {protected: Cake *pCake; //维护一个Cake对象的引用,为Cake对象添加装饰public: virtual void showCake() = 0; virtual ~CakeDecrator() {};}; classCakeDecratorMilk : public CakeDecrator {public: CakeDecratorMilk(Cake *pCake) { this->pCake = pCake; } void showCake() { this->name = pCake->name + "加奶油"; std::cout << name.c_str()<< std::endl; } virtual ~CakeDecratorMilk() {};}; classCakeDecratorChoclate: public CakeDecrator{public: CakeDecratorChoclate(Cake* pCake){ this->pCake = pCake; } void showCake(){ this->name = pCake->name + "加巧克力"; std::cout<<name.c_str()<<std::endl; }; virtual ~CakeDecratorChoclate(){};};
main.cpp代码
#include"decorator.h" int main(){ ConcreteCake *pConCake = newConcreteCake(); pConCake->showCake(); CakeDecratorMilk* pDecMilk = newCakeDecratorMilk(pConCake); pDecMilk->showCake(); CakeDecratorChoclate *pDecCho = newCakeDecratorChoclate(pDecMilk); pDecCho->showCake(); delete pConCake; delete pDecMilk; delete pDecCho; return 0;}
输出:
三、总结
装饰器模式与建造者模式的区别:建造者模式必须按照统一的步骤来构建某个对象,而装饰器模式不需要,例如上面的例子,你可以选择先涂奶油再涂巧克力。建造者模式按照统一步骤先造人的头、身体、手最后是脚,而装饰器模式是为这个已经建造好的人的对象添加内裤、上衣、帽子等。
阅读全文
0 0
- 【C++】装饰器模式
- c++实现装饰器模式
- c++实现装饰器模式
- 设计模式---装饰器模式(C++实现)
- 使用Object-C实现23种设计模式之装饰器模式
- 装饰模式(c++)
- 【C++】Chapter3:装饰模式
- Objective C--装饰模式
- Objective C 装饰模式
- 装饰者模式(c++)
- 装饰模式 C#
- 装饰模式(C++)
- python装饰器实现单例模式
- JAVA 中装饰器模式的实现
- python 单例模式----装饰器实现
- 装饰器实现单例模式
- 装饰模式C++实现
- 装饰模式c++实现
- tensorflow入门教程之CIFAR-10源代码
- 深入浅出php socket编程
- 虚拟币开发专题(市面上山寨币钱包开发对比)
- 1.4 class文件中的字段表集合--field字段在class文件中是怎样组织的
- cvte-c++-笔试2
- c++实现装饰器模式
- 文章标题 基础RMQ
- STL算法分析
- 1.5、 class文件中的方法表集合--method方法在class文件中是怎样组织的
- xynuoj 1247 fatmouse'trade
- android 定向分享app
- UIAutomator之---UiDevice
- 线程等待,退出
- 集合框架——泛型