#include <iostream> #include <string> using namespace std; class Component { public: virtual ~Component(){} virtual void Operation(){} protected: Component(){}; }; class ConcreteComponent : public Component { public: ConcreteComponent(){} ~ConcreteComponent(){} void Operation() { cout<<"ConcreteComponent::Operation()"<<endl; } }; class Decorator : public Component { public: Decorator(Component *compoent) : m_pComponent(compoent) { } ~Decorator(){delete m_pComponent;} void Operation() { } protected: Component *m_pComponent; // 被装饰对象的指针 }; class ConcreteDecorator : public Decorator { public: ConcreteDecorator(Component *com) : Decorator(com) { } ~ConcreteDecorator(){} void Operation() { m_pComponent->Operation(); // 调用被装饰对象的方法 AddedBehavior(); // 调用添加的动作 } void AddedBehavior() { cout<<"ConcreteDecorator::AddedBehavior()"<<endl; } }; class ConcreteDecoratorB : public Decorator { public: ConcreteDecoratorB(Component *com) : Decorator(com) { } ~ConcreteDecoratorB(){} void Operation() { m_pComponent->Operation(); // 调用被装饰对象的方法 AddedBehavior(); // 调用添加的动作 } void AddedBehavior() { cout<<"ConcreteDecoratorB::AddedBehavior()"<<endl; } }; int main() { //ConcreteDecorator给 ConcreteComponent类添加了动作 AddedBehavior。 Component *com = new ConcreteComponent(); Decorator *dec = new ConcreteDecorator(com); Decorator *decB = new ConcreteDecoratorB(dec); decB->Operation(); delete decB; return 0; } /////////////////////////////////////////// #include <iostream> #include <string> using namespace std; class Component { public: virtual void show() = 0; virtual ~Component(){cout<<"~Component"<<endl;} }; class Person : public Component { public: Person(){} ~Person(){cout <<"~Person"<< endl;} Person(string name) { this->name = name; } virtual void show() { cout<<"装扮的{0}"<<name<<endl; } private: string name; }; class Decorator: public Component { public: Decorator(Component *com):component(com){} ~Decorator() { if (component != NULL) delete component; cout<<"~Decorator"<<endl; } void show() { } protected: Component *component; }; class Finery : public Decorator { public: Finery(Component *com):Decorator(com){} ~Finery() { cout<<"~Finery"<<endl; } void show() { component->show(); cout<<"Finery"; } }; class TShirts : public Decorator { public: TShirts(Component *com):Decorator(com){} ~TShirts() { cout<<"~TShirts"<<endl; } void show() { component->show(); cout<<"大T恤 \n"; } }; int main() { Person * person = new Person("xiao hong"); Decorator *finery = new Finery(person); Decorator *tshirt = new TShirts(finery); tshirt->show(); delete tshirt; return 0; }