作用:
動態地給一個對象添加一些額外的職責。就增加功能來說,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.cppblog.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();
};
#endif
2)Decorator.cpp
/**//********************************************************************
created: 2006/07/20
filename: Decorator.cpp
author: 李創
http://www.cppblog.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.cppblog.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;
}