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

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

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


{
public:

????Component()
{}

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

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

//?抽象基類(lèi),維護(hù)一個(gè)指向Component對(duì)象的指針
class?Decorator
????:?public?Component


{
public:

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

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

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


{
public:

????ConcreateComponent()
{}

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

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

//?派生自Decorator,這里代表為ConcreateComponent動(dòng)態(tài)添加職責(zé)的類(lèi)
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模式的測(cè)試代碼
*********************************************************************/

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

int?main()


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

????pDecorator->Operation();

????delete?pDecorator;

????system("pause");

????return?0;
}
