装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活.
Component定义一个对象接口,可以给这些对象动态的添加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但是对于Component来说,是无需知道Decorator的存在的.至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能.
#pragma once //ConcreteComponent #include<iostream> #include<string> using namespace std; class Person { public: Person(){} Person(string lhs):name(lhs){} ~Person(void); virtual void Show() { cout<<"装扮的:"<<name<<endl; } private: string name; };
#pragma once #include "person.h" class CFinery : public Person { public: void Decorate(Person *components) { component = components; } virtual void Show() { component->Show(); } protected: Person *component; };
#pragma once #include "finery.h" class BigTrouser : public CFinery { public: virtual void Show() { cout<<"大裤衩"<<endl; CFinery::Show(); } };
#pragma once #include "finery.h" class Tshirts : public CFinery { public: Tshirts(void); ~Tshirts(void); virtual void Show() { cout<<"大Tshirt"<<endl; CFinery::Show(); } };
总结:装饰模式是为已有的功能动态地添加更多功能的一种方式.这种模式把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时候根据需要有选择的,有顺序的使用装饰功能包装对象了.