使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
责任链模式是使用多个对象处理用户请求的成熟模式,它的关键是将这处理对象组成一个链。每个对象含有后继对象的引用,如果不能处理目前的请求就把它传给后继对象处理。
该模式中有两种角色:
1、处理者:是一个接口或者抽象类,规定了具体处理者处理用户请求的方法,还有设置后继对象的方法
2、具体处理者:是具体的处理者的实现。
本例子中,是一个查询用户身份证号码的例子,不同的具体处理者代表不同的城市,然后对一个身份证号码的请求进行处理。有三个文件,Handler.h和Handler.cpp以及测试用的ResponsibilityChainTest.cpp
(1)Handler.h
1 #ifndef _HANDLER_H_ 2 #define _HANDLER_H_ 3 #include <iostream> 4 #include <list> 5 #include <string> 6 using namespace std; 7 8 /* 9 责任链模式 10 有很多的对象可以处理请求, 11 但是用户并不感知是那个对象处理了他的请求。 12 */ 13 14 //抽象类 15 class Handler{ 16 public: 17 virtual void handleRequest(string number) = 0; 18 virtual void setNextHandler(Handler* handler) = 0; 19 }; 20 21 22 //具体处理者1 23 class Beijing : public Handler{ 24 public: 25 Beijing(); 26 void handleRequest(string number) override; 27 void setNextHandler(Handler* handler) override; 28 29 private: 30 Handler *myHandler; 31 list<string> numberList; 32 }; 33 34 //具体处理者2 35 class Shanghai : public Handler{ 36 public: 37 Shanghai(); 38 void handleRequest(string number) override; 39 void setNextHandler(Handler* handler) override; 40 41 private: 42 Handler *myHandler; 43 list<string> numberList; 44 }; 45 46 //具体处理者3 47 class Tianjin : public Handler{ 48 public: 49 Tianjin(); 50 void handleRequest(string number) override; 51 void setNextHandler(Handler* handler) override; 52 53 private: 54 Handler *myHandler; 55 list<string> numberList; 56 }; 57 58 59 60 #endif