// 太美妙的思维,看了真是豁然开朗,自己怎么才能想出来呢? #include <iostream> #include <string> using namespace std; // 装饰模式,动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 // 使用:当系统需要增加新的功能的时候,可以向旧类中添加新的代码。这些新加的代码通常装饰了原 // 有类的核心职责或者主要行为,但是这样会增加主类的复杂度。装饰模式为我们提供了一个非常 // 好的解决方案,他把每个要装饰的功能放在的单独的类中,并让这个类包装他所要装饰的对象, // 因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择的,按顺序的使用装饰 // 功能包装对象了 // 优点:把类中的装饰功能从类中搬移去除,这样可以简化原有的类。有效的把类的核心职责和装饰功 // 能区分开了,可以去除相关类中重复的装饰逻辑。 class Person { public: Person(){} Person(string str):name(str){} string GetName() { return name; } virtual void Show() { cout << "装扮的" << GetName() << endl; } private: string name; }; // 装饰类 class PStyle : public Person { public: void Decorator(Person *conponent) { this->person = conponent; } void Show() { if (person != NULL) { person->Show(); } } protected: Person *person; // 记住,动态的条用虚函数必须通过对象的指针或者引用 }; // 具体装饰 class TShirt : public PStyle { public: void Show() { cout << " T恤 "; PStyle::Show(); } }; // 具体装饰 class Throuse : public PStyle { public: void Show() { cout << " c长裤子 "; PStyle::Show(); } }; class Sweter : public PStyle { public: void Show() { cout << " 大毛衣 "; PStyle::Show(); } }; void main() { Person xiaocai("小菜"); TShirt tx; Throuse th; Sweter sw; tx.Decorator(&xiaocai); th.Decorator(&tx); sw.Decorator(&th); sw.Show(); }