缺点:增加新的数据结构变得困难。
代码示例如下:
#pragma once #include <stdio.h> #include <list> using std::list; class Man; class Woman; //状态即操作 class Action { public: virtual void getmanconclusion(Man* man ){} virtual void getwomanconclusion(Woman* woman){} private: }; //数据结构抽象 class Person { public: virtual void accept(Action * action) { } }; class Success :public Action { public: virtual void getmanconclusion(Man* man) { printf("男人成功时,背后多半有一个伟大的女人\n"); } virtual void getwomanconclusion(Woman* woman) { printf("女人成功时,背后多半有一个不成功的男人\n"); } }; class Fail :public Action { public: virtual void getmanconclusion(Man* man) { printf("男人失败时,闷头喝酒谁也不用劝\n"); } virtual void getwomanconclusion(Woman* woman) { printf("女人失败时,泪眼汪汪,谁也劝不了\n"); } }; class Amativeness :public Action { public: virtual void getmanconclusion(Man* man) { printf("男人恋爱时,凡事不懂装懂\n"); } virtual void getwomanconclusion(Woman* woman) { printf("女人恋爱时,遇事懂也装作不懂\n"); } }; //实际数据 class Man :public Person { public: virtual void accept(Action * action) { action->getmanconclusion(this); } }; class Woman :public Person { public: virtual void accept(Action * action) { action->getwomanconclusion(this); } }; class Objectstructure { public: void attach(Person * person) { m_plist.push_back(person); } void detach(Person * person) { m_plist.remove(person); } //遍历所有 void display(Action * action) { for each (Person* person in m_plist) { person->accept(action); } } private: list<Person *> m_plist; }; //再添加状态类,比如结婚离婚,很容易。 //如果再添加一个男女之外的操作类,那所有的状态都需要改变,相对困难一些 int main() { Objectstructure o; Man m1; Woman w1; o.attach(&m1); o.attach(&w1); Success v1; o.display(&v1); Amativeness amt; o.display(&amt); Fail ffail; o.display(&ffail); return 0; }