九
14
定义
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰(Decorator)模式相比生成子类更为灵活。也叫包装器(Wrapper)。
结构
理解
1. Component是抽象基类,它是被装饰对象和装饰对象的共同基类,装饰的目的是为Component接口动态增加额外功能。ConcreteComponent是被装饰对象的具体类。
2. Decorator是装饰对象基类。它继承自Component,包含一个指向基类Component的指针,并且Decorator的接口必须和Component是一致的。ConcreateDecorator是具体的装饰类,装饰ConcreteComponent,具体装饰类包含额外职责方法(如AddedBehavior),这些方法可以作为私有成员来处理(对内开放-对外封闭原则)。
3. Component::Operation是被装饰接口。它的所有派生类都要实现Operation方法。具体的装饰类,在Operation方法的基础上增加额外职责。
4. 将ConceteComponent对象指针传给ConcreteDecorator产生装饰类。装饰类对基类方法Operation进行多态处理,这样就完成了对动态对象添加额外指责的功能。
要点
1. 装饰模式从完成了一些继承的功能。继承是静态特性,在编译期间增加类的功能;而Decorator模式是动态特性,在运行时动态地增加某个对象的功能。装饰模式可以解决类继承灵活性差的问题。
2. 使用继承方式产生子类,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长,成为“类爆炸”,装饰模式可以灵活地解决类爆炸问题。
应用
IO流的实现,就可以使用装饰模式实现各种IO流,java.oi包结构如下:

源码
#include <iostream>
#include <string>
using namespace std;
//被装饰类抽象基类
class CStream
{
public:
CStream(){};
virtual ~CStream(){};
//公共接口Operation
virtual void Write(const string &str) = 0;
};
//被装饰类具体类
class CFileStream : public CStream
{
public:
CFileStream(){};
virtual void Write(const string &str)
{
cout << "file stream content: " << str << endl;
};
};
//装饰类基类
class CStreamDecorator : public CStream
{
public:
//传入被装饰对象初始化装饰者
CStreamDecorator(CStream* pStream) : m_pStream(pStream)
{};
protected:
CStream* m_pStream; //指向抽象基类的指针
};
//装饰类具体类
class CCompressStreamDecorator : public CStreamDecorator
{
public:
CCompressStreamDecorator(CStream* pStream) : CStreamDecorator(pStream)
{};
virtual void Write(const string &str)
{
cout << "compress stream data…" << endl;
m_pStream->Write(str);
Compress(str);
};
protected:
//额外职责方法。即装饰内容
void Compress(const string &str)
{
cout << "using decorator compress: " << str << endl;
}
};
int main()
{
//被装饰对象
CStream* pStream = new CFileStream;
//传入被装饰对象初始化装饰者。
CStreamDecorator* pDecorator = new CCompressStreamDecorator(pStream);
pDecorator->Write("hello world");
delete pDecorator;
delete pStream;
system("pause");
return 0;
}
转载本站文章请注明,转载自:神秘果
本文链接: http://www.shenmiguo.com/archives/2009/305_design-patterns-decorator.html


5 Responses to “c++设计模式-装饰”
Trackbacks/Pingbacks
Leave a Reply