参考书籍:《设计模式 - 可复用面向对象软件的基础》
参考链接: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类图
参考链接: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类图
#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.扩展/补充
装饰模式与策略模式的异同: