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,从而添加处理的装饰,达到异常处理的扩展,这就是一个桥接模式与装饰模式的搭配;