作用:
動態(tài)地給一個對象添加一些額外的職責(zé)。就增加功能來說,Decorator 模式相比生成子類更為靈活。
UML結(jié)構(gòu)圖:

抽象基類:
1)Component:定義一個對象接口,可以為這個接口動態(tài)的添加職責(zé).
2)Decorator:維持一個指向Component的指針,并且有一個和Component一致的接口函數(shù).
接口函數(shù):
1)Component::Operation:這個接口函數(shù)由Component聲明,因此Component的派生類都需要實現(xiàn),可以在這個接口函數(shù)的基礎(chǔ)上給它動態(tài)添加職責(zé).
解析:
Decorator的派生類可以為ConcreateComponent類的對象動態(tài)的添加職責(zé),或者可以這么說:Decorator的派生類裝飾ConcreateComponent類的對象.具體是這么實現(xiàn)的,首先初始化一個ConcreateComponent類的對象(被裝飾者),采用這個對象去生成一個Decorator對象(裝飾者),之后對Operation函數(shù)的調(diào)用則是對這個Decorator對象成員函數(shù)的多態(tài)調(diào)用.這里的實現(xiàn)要點是Decorator類和ConcreateComponent類都繼承自Component,從而兩者的接口函數(shù)是一致的;其次,Decorator維護了一個指向Component的指針,從而可以實現(xiàn)對Component::Operation函數(shù)的動態(tài)調(diào)用.
實現(xiàn):
1)Decorator.h

/**//********************************************************************
????created:????2006/07/20
????filename:?????Decorator.h
????author:????????李創(chuàng)
????????????????http://www.shnenglu.com/converse/

????purpose:????Decorator模式的演示代碼
*********************************************************************/

#ifndef?DECORATOR_H
#define?DECORATOR_H

//?抽象基類,定義一個對象接口,可以為這個接口動態(tài)的添加職責(zé).
class?Component


{
public:

????Component()
{}

????virtual?~Component()
{}

????//?純虛函數(shù),由派生類實現(xiàn)
????virtual?void?Operation()?=?0;
};

//?抽象基類,維護一個指向Component對象的指針
class?Decorator
????:?public?Component


{
public:

????Decorator(Component*?pComponent)?:?m_pComponent(pComponent)
{}
????virtual?~Decorator();

protected:
????Component*?m_pComponent;
};

//?派生自Component,在這里表示需要給它動態(tài)添加職責(zé)的類
class?ConcreateComponent
????:?public?Component


{
public:

????ConcreateComponent()
{}

????virtual?~ConcreateComponent()
{}

????virtual?void?Operation();
};

//?派生自Decorator,這里代表為ConcreateComponent動態(tài)添加職責(zé)的類
class?ConcreateDecorator
????:?public?Decorator


{
public:

????ConcreateDecorator(Component*?pComponent)?:?Decorator(pComponent)
{}

????virtual?~ConcreateDecorator()
{}

????virtual?void?Operation();

private:
????void?AddedBehavior();
};

#endif2)Decorator.cpp

/**//********************************************************************
????created:????2006/07/20
????filename:?????Decorator.cpp
????author:????????李創(chuàng)
????????????????http://www.shnenglu.com/converse/

????purpose:????Decorator模式的演示代碼
*********************************************************************/

#include?"Decorator.h"
#include?<iostream>

Decorator::~Decorator()


{
????delete?m_pComponent;
????m_pComponent?=?NULL;
}

void?ConcreateComponent::Operation()


{
????std::cout?<<?"Operation?of?ConcreateComponent\n";
}

void?ConcreateDecorator::Operation()


{
????m_pComponent->Operation();
????AddedBehavior();
}

void?ConcreateDecorator::AddedBehavior()


{
????std::cout?<<?"AddedBehavior?of?ConcreateDecorator\n";
}3)Main.cpp

/**//********************************************************************
????created:????2006/07/20
????filename:?????Main.cpp
????author:????????李創(chuàng)
????????????????http://www.shnenglu.com/converse/

????purpose:????Decorator模式的測試代碼
*********************************************************************/

#include?"Decorator.h"
#include?<stdlib.h>

int?main()


{
????//?初始化一個Component對象
????Component*?pComponent?=?new?ConcreateComponent();
????//?采用這個Component對象去初始化一個Decorator對象,
????//?這樣就可以為這個Component對象動態(tài)添加職責(zé)
????Decorator*?pDecorator?=?new?ConcreateDecorator(pComponent);

????pDecorator->Operation();

????delete?pDecorator;

????system("pause");

????return?0;
}
