装饰模式:动态的给一个对象添加一些额外的职责(不重要的功能,只是偶然一次要执行)。就增加功能来说,Decorator模式比使用继承生成子类更为灵活。
建造过程不稳定,需要把所需的功能按正确的顺序串联起来进行控制。
2、优缺点分析
GOOD:当你向旧的类中添加新代码时,一般是为了添加核心职责或主要行为。而当需要加入的仅仅是一些特定情况下才会执行的特定的功能时(简单点就是不是核心应用的功能),就会增加类的复杂度。
装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,
当需要执行时,客户端就可以有选择地、按顺序地使用装饰功能包装对象。
3、UML标准图
1)Component:定义一个对象接口,可以给这些对象动态的添加职责。
2)Decorator:装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。
实际上是维持了一个指向Component的指针,并且有一个和Componet一致的接口函数
3)ConcreteDecorator:具体的装饰对象,起到给Component添加职责的功能。
注意:接口函数Operation()是关键,它由Component声明,因此Component的派生类都需要实现,可以在这个接口函数的基础上给它动态的添加职责。
解释:Decorator的派生类ConcreateComponent类的对象的实现过程是:首先初始化一个ConcreateComponent类对象(被装饰者),采用这个对象去生成一个Decorator对象(装饰者),之后对Operation函数的调用则是对这个Decorator对象成员函数的多态调用。
要点:Decorator类和ConcreateComponent类都继承自Component,从而两者的接口函数是一致的。
其次,Decorator维护了一个指向Component的指针,从而可以对Component::Operation函数作多态调用
变通:
(1)如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类。
(2)如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类
4、标准源码
#ifndef DECORATOR_H
#define DECORATOR_H
3:
// 抽象基类,定义一个对象接口,可以为这个接口动态的添加职责.
class Component
6: {
public:
8: Component(){}
virtual ~Component(){}
10:
// 纯虚函数,由派生类实现
void Operation() = 0;
13: };
14:
// 抽象基类,维护一个指向Component对象的指针
class Decorator
public Component
18: {
public:
20: Decorator(Component* pComponent) : m_pComponent(pComponent){}
virtual ~Decorator();
22:
protected:
24: Component* m_pComponent;
25: };
26:
// 派生自Component,在这里表示需要给它动态添加职责的类
class ConcreateComponent
public Component
30: {
public:
32: ConcreateComponent(){}
virtual ~ConcreateComponent(){}
34:
void Operation();
36: };
37:
// 派生自Decorator,这里代表为ConcreateComponent动态添加职责的类
class ConcreateDecorator
public Decorator
41: {
public:
43: ConcreateDecorator(Component* pComponent) : Decorator(pComponent){}
virtual ~ConcreateDecorator(){}
45:
void Operation();
47:
private:
void AddedBehavior();
50: };
51:
#endif
#include <iostream>
3:
4: Decorator::~Decorator()
5: {
delete m_pComponent;
7: m_pComponent = NULL;
8: }
9:
void ConcreateComponent::Operation()
11: {
;
13: }
14:
void ConcreateDecorator::Operation()
16: {
17: m_pComponent->Operation();
18: AddedBehavior();
19: }
20:
void ConcreateDecorator::AddedBehavior()
22: {
;
24: }
#include <stdlib.h>
3:
int main()
5: {
// 初始化一个Component对象
new ConcreateComponent();
// 采用这个Component对象去初始化一个Decorator对象,
// 这样就可以为这个Component对象动态添加职责
new ConcreateDecorator(pComponent);
11:
12: pDecorator->Operation();
13:
delete pDecorator;
15:
);
17:
return 0;
19: }