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

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

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

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

#ifndef?DECORATOR_H
#define?DECORATOR_H

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


{
public:

????Component()
{}

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

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

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


{
public:

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

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

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


{
public:

????ConcreateComponent()
{}

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

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

//?派生自Decorator,這里代表為ConcreateComponent動態添加職責的類
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:????????李創
????????????????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:????????李創
????????????????http://www.shnenglu.com/converse/

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

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

int?main()


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

????pDecorator->Operation();

????delete?pDecorator;

????system("pause");

????return?0;
}
