设计模式探秘-14-装饰模式

装饰模式的学习与实践

装饰模式

装饰模式定义:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更加灵活。

类图

  1. Component 抽象构建 一个接口或者抽象类,定义最核心的对象,最原始的对象
  2. ConcreteComponent 具体构建 最核心、最原始、最基本接口或抽象类的实现,需要修饰的对象
  3. Decorator 修饰角色 必然有一个private变量指向Componet抽象构建
  4. ConcreteDecorator 具体装饰角色

优点

  1. 装饰类和被装饰类可以独立发展,而不会相互耦合。
  2. 装饰模式是继承关系的替代方案。
  3. 装饰模式可以动态扩展一个实现类的功能。

缺点

多层的装饰是比较复杂的,应尽量减少装饰类的数量,降低系统复杂度。

使用场景

  1. 需要扩展一个类的功能,或给一个类增加附加功能
  2. 需要动态地给一个对象增加功能,该功能可以再动态的撤销
  3. 需要为一批兄弟类进行改装或加装功能

注意事项

扩展

实践

装饰模式是对继承的有力补充。

简单实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>

using namespace std;

//装饰模式
class Component
{
public:
virtual ~Component()
{
}
virtual void Operation()
{
};
protected:
Component()
{
}
};

class ConcreteComponent : public Component
{
public:
ConcreteComponent()
{
}
~ConcreteComponent()
{
}
void Operation()
{
cout<<"ConcreteComponent "<<__FUNCTION__<<endl;
}
};

class Decorator : public Component
{
public:
Decorator(Component *com)
{
m_pCom = com;
}
virtual ~Decorator()
{
delete m_pCom;
}
void Operation()
{
}
protected:
Component *m_pCom;
};

class ConcreteDecorator : public Decorator
{
public:
ConcreteDecorator(Component *com) : Decorator(com)
{
}
~ConcreteDecorator()
{
}
void Operation()
{
m_pCom->Operation();
AddedBehavior();
}
void AddedBehavior()
{
cout<<"ConcreteDecorator "<<__FUNCTION__<<endl;
}
};

int main()
{
Component *com = new ConcreteComponent();
Decorator *dec = new ConcreteDecorator(com);
dec->Operation();
delete dec;
return 0;
}

参考资料

  1. 设计模式之禅
  2. GoF+23种设计模式解析