责任链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象练成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。该模式很好理解,其UML图如下: 每个ConcreteHandler都有一定的请求处理能力,当自己处理不了的时候就把请求转移给自己的后继者。所以每个ConcreteHandler都有一个Handler的引用。示例代码如下:
// ChainofResponsibilityModel.h文件 #pragma once #include <iostream> class Handler { protected: Handler * m_sucessor; public: void setSucessor(Handler * p) { m_sucessor = p; } virtual void processRequest(int n) = 0; }; class ConcreteHandler_0 : public Handler { public: void processRequest(int n) { if (n > 0 && n <= 10) { std::cout << "ConcreteHandler_0 process the request!" << std::endl; } else if (nullptr != m_sucessor) { m_sucessor->processRequest(n); } else { std::cout << "Cannot process the request!" << std::endl; } } }; class ConcreteHandler_1 : public Handler { public: void processRequest(int n) { if (n > 10 && n <= 20) { std::cout << "ConcreteHandler_1 process the request!" << std::endl; } else if (nullptr != m_sucessor) { m_sucessor->processRequest(n); } else { std::cout << "Cannot process the request!" << std::endl; } } }; class ConcreteHandler_2 : public Handler { public: void processRequest(int n) { if (n > 20 && n <= 30) { std::cout << "ConcreteHandler_2 process the request!" << std::endl; } else if (nullptr != m_sucessor) { m_sucessor->processRequest(n); } else { std::cout << "Cannot process the request!" << std::endl; } } };测试代码如下:
#include <iostream> #include "ChainofResponsibilityModel.h" int main() { using namespace std; // 责任链模式 Handler *p = new ConcreteHandler_0(); Handler * p1 = new ConcreteHandler_1(); Handler * p2 = new ConcreteHandler_2(); p->setSucessor(p1); p1->setSucessor(p2); p->processRequest(10); p->processRequest(26); p->processRequest(15); p->processRequest(100); delete p1; delete p2; delete p; getchar(); return 0;其测试结果如下图: 责任链模式的优点是当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它。这就使得接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构。结果是责任链可简化对象的相互连接,它们仅需保持一个指向后继的引用,而不需保持它素有的候选接收者的引用。而链的结构是由客户端来定义的。可以随时增加或修改吃力一个请求的结构。增强了给对象指派职责的灵活性。