1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Component 7 { 8 public: 9 virtual void operation() = 0; 10 }; 11 12 class ConcreteComponentA: public Component 13 { 14 public: 15 virtual void operation() 16 { 17 cout<< "ConcreteComponentA....."<< endl; 18 } 19 }; 20 21 class ConcreteComponentB: public Component 22 { 23 public: 24 virtual void operation() 25 { 26 cout<< "ConcreteComponentB....."<< endl; 27 } 28 }; 29 30 class Decorator:public Component 31 { 32 public: 33 Decorator(Component* pCom):component(pCom){} 34 35 virtual void operation() = 0; 36 37 Component* component; 38 }; 39 40 class ConcreteDecoratorA: public Decorator 41 { 42 public: 43 ConcreteDecoratorA(Component* pCom):Decorator(pCom){} 44 45 void operation() 46 { 47 component->operation(); 48 AddBehavior(); 49 } 50 51 void AddBehavior() 52 { 53 cout<< "ConcreteDecoratorA....."<< endl; 54 } 55 }; 56 57 class ConcreteDecoratorB: public Decorator 58 { 59 public: 60 ConcreteDecoratorB(Component* pCom):Decorator(pCom){} 61 62 void operation() 63 { 64 component->operation(); 65 AddBehavior(); 66 } 67 68 void AddBehavior() 69 { 70 cout<< "ConcreteDecoratorB....."<< endl; 71 } 72 }; 73 74 int main(int argc, char* argv[]) 75 { 76 ConcreteComponentB* ccB = new ConcreteComponentB(); 77 78 ConcreteDecoratorA* cdA1 = new ConcreteDecoratorA(ccB); 79 80 ConcreteDecoratorA* cdA2 = new ConcreteDecoratorA(cdA1); 81 82 ConcreteDecoratorB* cdB1 = new ConcreteDecoratorB(cdA1); 83 84 cdA1->operation();cout<< endl; 85 cdA2->operation();cout<< endl; 86 cdB1->operation();cout<< endl; 87 88 return 0; 89 } 90 91 /////////////////////////// 92 [root]$ ./decorator 93 ConcreteComponentB..... 94 ConcreteDecoratorA..... 95 96 ConcreteComponentB..... 97 ConcreteDecoratorA..... 98 ConcreteDecoratorA..... 99 100 ConcreteComponentB..... 101 ConcreteDecoratorA..... 102 ConcreteDecoratorB.....