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

参考书籍:《设计模式 - 可复用面向对象软件的基础》
参考链接: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.扩展/补充

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值