设计模式(五):装饰模式(Decorator)

来源:互联网 发布:易云软件 编辑:程序博客网 时间:2024/05/18 11:39
参考书籍:《设计模式 - 可复用面向对象软件的基础》
参考链接: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->pConcreteComponetpConcreteDecoratorB->Operaton();if (pConcreteComponet){delete pConcreteComponet;pConcreteComponet = nullptr;}if (pConcreteDecoratorA){delete pConcreteDecoratorA;pConcreteDecoratorA = nullptr;}if (pConcreteDecoratorB){delete pConcreteDecoratorB;pConcreteDecoratorB = nullptr;}

输出:

ConcreteComponet OperatonConcreteDecoratorA OtherOperatonConcreteDecoratorB OtherOperaton请按任意键继续. . .

5.扩展/补充

装饰模式与策略模式的异同:


0 0
原创粉丝点击