Decorator 装饰

意图

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

结构

Component:定义一个对象接口,可以给这些对象动态地添加职责;(纯虚函数)

ConcreteComponent:定义一个具体的Component,继承自Component,重写了Component类的虚函数;(继承Component,实现纯虚函数)

Decorator:维持一个指向Component对象的指针,该指针指向需要被装饰的对象;并定义一个与Component接口一致的接口;(继承Component,提供接口(接口就是那个纯虚函数))

ConcreteDecorator:向组件添加职责。(添加具体功能)

实现

 1 #include <iostream>
 2 using namespace std;
 3 class Component
 4 {
 5 public:
 6     virtual void Operation() = 0;
 7 };
 8 class ConcreteComponent : public Component
 9 {
10 public:
11     void Operation()
12     {
13         cout << "I am no decoratored ConcreteComponent" << endl;
14     }
15 };
16 class Decorator : public Component
17 {
18 public:
19     Decorator(Component *pComponent) : m_pComponentObj(pComponent) {}
20     void Operation()
21     {
22         if (m_pComponentObj != NULL)
23         {
24             m_pComponentObj->Operation();
25         }
26     }
27 protected:
28     Component *m_pComponentObj;
29 };
30 class ConcreteDecoratorA : public Decorator
31 {
32 public:
33     ConcreteDecoratorA(Component *pDecorator) : Decorator(pDecorator){}
34     void Operation()
35     {
36         AddedBehavior();
37         Decorator::Operation();
38     }
39     void  AddedBehavior()
40     {
41         cout << "This is added behavior A." << endl;
42     }
43 };
44 class ConcreteDecoratorB : public Decorator
45 {
46 public:
47     ConcreteDecoratorB(Component *pDecorator) : Decorator(pDecorator){}
48     void Operation()
49     {
50         AddedBehavior();
51         Decorator::Operation();
52     }
53     void  AddedBehavior()
54     {
55         cout << "This is added behavior B." << endl;
56     }
57 };
58 int main()
59 {
60     Component *pComponentObj = new ConcreteComponent();
61     Decorator *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj);
62     pDecoratorAOjb->Operation();
63     cout << "=============================================" << endl;
64     Decorator *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj);
65     pDecoratorBOjb->Operation();
66     cout << "=============================================" << endl;
67     Decorator *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb);
68     pDecoratorBAOjb->Operation();
69     cout << "=============================================" << endl;
70     delete pDecoratorBAOjb;
71     pDecoratorBAOjb = NULL;
72     delete pDecoratorBOjb;
73     pDecoratorBOjb = NULL;
74     delete pDecoratorAOjb;
75     pDecoratorAOjb = NULL;
76     delete pComponentObj;
77     pComponentObj = NULL;
78 }

桥接和装饰的区别

二者都是为了防止过度的继承,从而造成子类泛滥的情况。

桥接模式的定义是将抽象化与实现化分离(用组合的方式而不是继承的方式),使得两者可以独立变化。可以减少派生类的增长。装饰是在一个核心功能上添加一些附属功能,从而让核心功能发挥更大的作用,但是最终它的核心功能是不能丢失的。

桥接模式中所说的分离,其实是指将结构与实现分离(当结构和实现有可能发生变化时)或属性与基于属性的行为进行分离;而装饰者只是对基于属性的行为进行封闭成独立的类,从而达到对其进行装饰,也就是扩展。比如:异常类和异常处理类之间就可以使用桥接模式来实现完成,而不能使用装饰模式来进行设计;如果对于异常的处理需要进行扩展时,我们又可以对异常处理类添加Decorator,从而添加处理的装饰,达到异常处理的扩展,这就是一个桥接模式与装饰模式的搭配;

原文地址:https://www.cnblogs.com/raichen/p/5764117.html