设计模式(五):装饰模式(Decorator)
2015-12-19 18:02
246 查看
参考书籍:《设计模式 - 可复用面向对象软件的基础》
参考链接:http://www.cnblogs.com/cxjchen/p/3161686.html
目录
1.介绍/作用:
2.应用场景:
3.UML类图
4.实现代码
5.扩展/补充
1.介绍/作用:
动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。
2.应用场景:
有时我们希望给某个对象而不是整个类添加一些功能。例如,一个图形用户界面工具箱
允许你对任意一个用户界面组件添加一些特性,例如边框,或是一些行为,例如窗口滚动。
例如,假定有一个对象Te x t Vi e w,它可以在窗口中显示正文。缺省的Te x t Vi e w没有滚动
条,因为我们可能有时并不需要滚动条。当需要滚动条时,我们可以用S c r o l l D e c o r a t o r添加滚
动条。如果我们还想在Te x t Vi e w周围添加一个粗黑边框,可以使用B o r d e r D e c o r a t o r添加。因
此只要简单地将这些装饰和Te x t Vi e w进行组合,就可以达到预期的效果。
下面的对象图展示了如何将一个Te x t Vi e w对象与B o r d e r D e c o r a t o r以及S c r o l l D e c o r a t o r对象
组装起来产生一个具有边框和滚动条的文本显示窗口。
S c r o l l D e c o r a t o r和BorderDecorator 类是D e c o r a t o r类的子类。D e c o r a t o r类是一个可视组件
的抽象类,用于装饰其他可视组件,如下图所示。
Vi s u a l C o m p o n e n t是一个描述可视对象的抽象类,它定义了绘制和事件处理的接口。注意
D e c o r a t o r类怎样将绘制请求简单地发送给它的组件,以及D e c o r a t o r的子类如何扩展这个操作。
D e c o r a t o r的子类为特定功能可以自由地添加一些操作。例如,如果其他对象知道界面中
恰好有一个S c r o l l D e c o r a t o r对象,这些对象就可以用S c r o l l D e c o r a t o r对象的S c r o l l To操作滚动这
个界面。这个模式中有一点很重要,它使得在Vi s u a l C o m p o n e n t可以出现的任何地方都可以有
装饰。因此,客户通常不会感觉到装饰过的组件与未装饰组件之间的差异,也不会与装饰产
生任何依赖关系。
3.UML类图
4.实现代码
客户端:
输出:
5.扩展/补充
装饰模式与策略模式的异同:
参考链接:http://www.cnblogs.com/cxjchen/p/3161686.html
目录
1.介绍/作用:
2.应用场景:
3.UML类图
4.实现代码
5.扩展/补充
1.介绍/作用:
动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。
2.应用场景:
有时我们希望给某个对象而不是整个类添加一些功能。例如,一个图形用户界面工具箱
允许你对任意一个用户界面组件添加一些特性,例如边框,或是一些行为,例如窗口滚动。
例如,假定有一个对象Te x t Vi e w,它可以在窗口中显示正文。缺省的Te x t Vi e w没有滚动
条,因为我们可能有时并不需要滚动条。当需要滚动条时,我们可以用S c r o l l D e c o r a t o r添加滚
动条。如果我们还想在Te x t Vi e w周围添加一个粗黑边框,可以使用B o r d e r D e c o r a t o r添加。因
此只要简单地将这些装饰和Te x t Vi e w进行组合,就可以达到预期的效果。
下面的对象图展示了如何将一个Te x t Vi e w对象与B o r d e r D e c o r a t o r以及S c r o l l D e c o r a t o r对象
组装起来产生一个具有边框和滚动条的文本显示窗口。
S c r o l l D e c o r a t o r和BorderDecorator 类是D e c o r a t o r类的子类。D e c o r a t o r类是一个可视组件
的抽象类,用于装饰其他可视组件,如下图所示。
Vi s u a l C o m p o n e n t是一个描述可视对象的抽象类,它定义了绘制和事件处理的接口。注意
D e c o r a t o r类怎样将绘制请求简单地发送给它的组件,以及D e c o r a t o r的子类如何扩展这个操作。
D e c o r a t o r的子类为特定功能可以自由地添加一些操作。例如,如果其他对象知道界面中
恰好有一个S c r o l l D e c o r a t o r对象,这些对象就可以用S c r o l l D e c o r a t o r对象的S c r o l l To操作滚动这
个界面。这个模式中有一点很重要,它使得在Vi s u a l C o m p o n e n t可以出现的任何地方都可以有
装饰。因此,客户通常不会感觉到装饰过的组件与未装饰组件之间的差异,也不会与装饰产
生任何依赖关系。
3.UML类图
4.实现代码
#ifndef _DECORATOR_H_ #define _DECORATOR_H_ #include <iostream> using namespace std; //父类 class Componet { public: Componet(){}; virtual ~Componet(){}; virtual void Operaton() = 0; private: }; //被装饰的对象 class ConcreteComponet :public Componet { public: ConcreteComponet(){}; virtual ~ConcreteComponet(){}; virtual void Operaton(){ cout << "ConcreteComponet Operaton" << endl; } private: }; //装饰部分 class Decorator :public Componet { public: Decorator(Componet* componet){ this->pComponet = componet; }; virtual ~Decorator() { } virtual void Operaton() { //cout << "Decorator Operaton" << endl; pComponet->Operaton(); } private: Componet* pComponet; }; class ConcreteDecoratorA :public Decorator { public: ConcreteDecoratorA(Componet* componet) :Decorator(componet){ } virtual ~ConcreteDecoratorA(){ cout << "~ConcreteDecoratorA()" << endl; }; virtual void Operaton() { //调用Decorator 的方法 Decorator::Operaton(); //子类其他扩展方法 OtherOperaton(); } virtual void OtherOperaton() { cout << "ConcreteDecoratorA OtherOperaton" << endl; } private: }; class ConcreteDecoratorB :public Decorator { public: ConcreteDecoratorB(Componet* componet) :Decorator(componet){ } virtual ~ConcreteDecoratorB(){} virtual void Operaton() { //调用Decorator 的方法 Decorator::Operaton(); //子类其他扩展方法 OtherOperaton(); } virtual void OtherOperaton() { cout << "ConcreteDecoratorB OtherOperaton" << endl; } private: }; #endif
客户端:
//装饰模式 ConcreteComponet* pConcreteComponet = new ConcreteComponet(); ConcreteDecoratorA* pConcreteDecoratorA = new ConcreteDecoratorA(pConcreteComponet); ConcreteDecoratorB* pConcreteDecoratorB = new ConcreteDecoratorB(pConcreteDecoratorA); //pConcreteDecoratorB->pConcreteDecoratorA->pConcreteComponet pConcreteDecoratorB->Operaton(); if (pConcreteComponet) { delete pConcreteComponet; pConcreteComponet = nullptr; } if (pConcreteDecoratorA) { delete pConcreteDecoratorA; pConcreteDecoratorA = nullptr; } if (pConcreteDecoratorB) { delete pConcreteDecoratorB; pConcreteDecoratorB = nullptr; }
输出:
ConcreteComponet Operaton ConcreteDecoratorA OtherOperaton ConcreteDecoratorB OtherOperaton 请按任意键继续. . .
5.扩展/补充
装饰模式与策略模式的异同:
相关文章推荐
- 使用phpMyAdmin管理MySQL数据库
- 四级Over
- 是readdir,还是readdir_r
- [Java学习] Java实现倒计时代码
- Hdfs增量导入小文件合并的思路
- 利用win7usb-dvdtool工具u盘安装win7
- lambda 是个啥玩意 - 对listdir排序
- Hdfs增量导入小文件合并的思路
- Hdfs增量导入小文件合并的思路
- android中setImageResource加载大图片出现oom解决方案
- Android官方文档翻译 十八 4.2Pausing and Resuming an Activity
- CentOS7 安装小小输入法
- Command find
- dd命令:做硬盘IO性能测试
- PyQt4学习笔记8之绘图
- 10024---CSS Align(对齐)
- 目标检测的图像特征提取之(三)Haar特征
- 轻量级JavaEE企业应用实战(十)
- [原创]Mac系统下制作OS 10.11安装镜像
- 一个类似CColorDialog中颜色选择的控件实现