10 结构型模式-----装饰模式

模式动机(Decorator Pattern)我们在给一个类进行功能扩展时,总是通过继承或者复合关系,使得一个类具有其他相关类型的功能,继承本身属于静态关联,派生类比较臃肿,使用者也不能控制增加功能的方式。而使用复合机制,即将一个类的对象作为另一个类的成员,我们可以决定什么时候调用哪种功能,非常方便,这就是装饰模式,即给一个现有的类进行装饰,使其具有我们希望的功能。

模式结构图:

模式代码:

bt_装饰模式.h

 

 1 #ifndef DP_H
 2 #define DP_H
 3 #include <iostream>
 4 using namespace std;
 5 
 6 /*
 7     抽象组件类
 8 */
 9 class Component
10 {
11 public:
12     virtual ~Component(){ }
13     virtual void Operation(){ }
14 };
15 
16 /*
17     具体组件类
18 */
19 class ConcreteComponent : public Component
20 {
21 public:
22     virtual void Operation()
23     {
24         cout << "具体组件类的功能" << endl;
25     }
26 };
27 
28 /*
29     抽象装饰器类:维护一个指向抽象组件类的指针,
30     并定义一个与抽象组件类一致的接口
31 */
32 class Decorator : public Component
33 {
34 public:
35     Decorator(Component* pCom) : component(pCom){ }
36     virtual void Operation()
37     {
38         component->Operation();     // 调用抽象组件类的功能
39     }
40 
41 private:
42     Component* component;
43 };
44 
45 /*
46     具体装饰器:负责对组件进行装饰以添加新功能
47 */
48 class ConcreteDecoratorA : public Decorator
49 {
50 public:
51     ConcreteDecoratorA(Component* pCom, int state = 0) : Decorator(pCom), addedState(state){ }
52     virtual void Operation()
53     {
54         Decorator::Operation();
55         cout << "装饰器A为组件新增状态 = " << addedState << endl;
56     }
57 
58 private:
59     int addedState;
60 };
61 
62 class ConcreteDecoratorB : public Decorator
63 {
64 public:
65     ConcreteDecoratorB(Component* pCom) : Decorator(pCom){ }
66     virtual void Operation()
67     {
68         Decorator::Operation();
69         AddedBehavior();
70 }
71 
72 private:
73     void AddedBehavior()            // 具体装饰器新增的功能
74     {
75         cout << "装饰器B为组件新增功能" << endl;
76     }
77 };
78 
79 #endif // DP_H

 

测试用例.cpp

 1 #include "bt_装饰模式.h"
 2 
 3 int main()
 4 {
 5     cout << "***** 装饰模式测试 *****" << endl;
 6     Component* pCom = new ConcreteComponent;
 7     pCom->Operation();                          // 未装饰时
 8     cout << endl;
 9 
10     cout << "装饰器A" << endl;
11     Decorator* pDec1 = new ConcreteDecoratorA(pCom);
12     pDec1->Operation();                         // 第一次装饰后
13     cout << endl;
14 
15     cout << "装饰器B" << endl;
16     Decorator* pDec2 = new ConcreteDecoratorB(pDec1);
17     pDec2->Operation();                         // 第二次装饰后
18 
19     delete pDec2;
20     delete pDec1;
21     delete pCom;
22 
23     return 0;
24 }

模式优缺点:

1》 相比于静态继承扩展,装饰器模式可以提供更多的灵活性,它允许客户在运行时添加装饰功能,而继承则是在静态编译时就确定了,再者,多重继承时虽然很多功能派生类用不到,但是仍然不得不处理。相比而言,装饰器可以通过多个不同的装饰类来装饰组件从而添加不同的新功能,扩展非常方便。

2》 组件层次和装饰层次耦合性比较低,可以独立发展,通过搭配不同的具体组件和具体装饰器可以实现不同的组合,新增时不需要改变源代码,符合“开闭原则”。

3》 装饰模式比较麻烦,使用时可能需要创建多个装饰类对象,使得系统设计复杂度增大;若多次级联调用装饰器,一旦出错必须逐级排查。

 

 

 

原文地址:https://www.cnblogs.com/benxintuzi/p/4548742.html