Design Pattern Chain of Reponsibility 责任链模式
本程序实现一个责任链模式查询人名的资料。
開始都是查询第一个人,问其是否有某人的资料,假设有就返回结果,假设没有第一个人就会询问第二个人,第二个人的行为和第一个人的行为一致的,然后一致传递下去,直到找到答案,或者是最后没有资料,返回。
首先创建一个基类:
//base class class Person { public: virtual void getInfo(string name) = 0; };
第一个人的类:
主要行为函数是getInfor,就是一个if else推断,这里使用map来保存数据,要查询的数据在map里面,那么返回结果,假设不在,那么就调用下一个person的getInfo函数,等于询问下一个人,如此循环下去
//derived help class FirstPerson : public Person { unordered_map<string, string> um_ss; Person *successor; public: FirstPerson(Person *h) : successor(h), um_ss() { um_ss["Bill Gate"] = "Microsoft's founder"; um_ss["Job Steve"] = "Apple's founder"; } void getInfo(string name) { if (um_ss.count(name) ) { cout<<"First person say: "<<name<<" is "<<um_ss[name]<<endl; } else successor->getInfo(name); } };
第二个人和最后一个人的类例如以下:
class SecondPerson : public Person { unordered_map<string, string> um_ss; Person *successor; public: SecondPerson(Person *h) : successor(h), um_ss() { um_ss["Mark Zuckerberg"] = "Facebook's founder"; um_ss["雷军"] = "小米's founder"; } void getInfo(string name) { if (um_ss.count(name) ) { cout<<"Second person say: "<<name<<" is "<<um_ss[name]<<endl; } else successor->getInfo(name); } }; class FinalPerson : public Person { public: FinalPerson() { } void getInfo(string name) { cout<<"Final person say: "<<name<<" is "<<"not a famous name!\n"; } };
这样接口也是统一的,仅仅须要问一个人就能得到答案了。
測试例如以下:
void ChainOfResponsibility_Run() { FinalPerson finPer; SecondPerson secPer(&finPer); FirstPerson firPer(&secPer); firPer.getInfo("雷军"); firPer.getInfo("You know who"); firPer.getInfo("Bill Gate"); }
结果:
能够看到询问的都是第一个人的类,可是因为第一个人的类会调用自身的succssor,后继类,所以会可能得到第二个人Seconde person和最后一个人Final person的回答。