职责链模式将对象的请求处理组成链式结构,并将请求按链式结构逐个传递下去,直接被其中的某个处理者处理为止。由此可知,职责链模式的适用场合是对指定请求,可以有多个请求处理者(或称为请求响应者),但用户并不知道(也不需要知道--------此如做到请求者与响应者的解耦合)当时运行环境下该请求会被具体的哪个处理者处理(又或者说完全都没有被响应)。请求者只是抛出一个请求,响应链内部(即:模式内部)自己决定是否能处理以及谁能处理该请求。该模式的类结构图参考如下:
模式的编码结构参考如下:
1 namespace chain_of_responsibility 2 { 3 class IHandler 4 { 5 public: 6 IHandler(IHandler* pNextHandler) : m_pNextHandler(pNextHandler) {} 7 virtual ~IHandler() {} 8 virtual bool handleRequest(/*requester type parameters here........*/) { /*do something here........*/return false; } 9 10 private: 11 IHandler* m_pNextHandler; 12 13 };//class IHandler 14 15 class ConcreteHandler1 : public IHandler 16 { 17 public: 18 // some code here........ 19 virtual bool handleRequest(/*requester type parameters here........*/) { 20 /* 21 if (can handle this request) { 22 do something here........ 23 return true; 24 } else if (nullptr != m_pNextHandler) { 25 return m_pNextHandler->handleRequest(the parameters........); 26 } 27 */ 28 return false; 29 } 30 31 };//class ConcreteHandler1 32 33 class ConcreteHandler2 : public IHandler 34 { 35 public: 36 // some code here........ 37 virtual bool handleRequest(/*requester type parameters here........*/) { 38 /* 39 if (can handle this request) { 40 do something here........ 41 return true; 42 } else if (nullptr != m_pNextHandler) { 43 return m_pNextHandler->handleRequest(the parameters........); 44 } 45 */ 46 return false; 47 } 48 49 };//class ConcreteHandler2 50 51 class IRequester {}; 52 53 class Client 54 { 55 public: 56 void test() { 57 // 58 // they are test code below. 59 // 60 auto pRequester = new (std::nothrow) IRequester(); 61 auto pHandler1 = new (std::nothrow) ConcreteHandler1(nullptr); 62 auto pHandler2 = new (std::nothrow) ConcreteHandler2(pHandler1); 63 pHandler1->handleRequest(pRequester); 64 } 65 66 };//class Client 67 68 }//namespace chain_of_responsibility