您的位置:首页 > 其它

设计模式(五):装饰模式(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.实现代码
#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.扩展/补充

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: