Chapter24 职责链模式
职责链模式简介
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
此模式的关键点在于,当客户提交一个请求时,请求是沿着链传递直至有一个ConcreteHandler对象负责处理它。这就使得接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互联系,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接收者的引用。如此大大减低了耦合度。
此模式是由客户端来定义链的结构,客户可随时地增加或修改处理一个请求的结构,增强了对象指派职责的灵活性。
需要注意不能出现,一个请求到达链的末端还未得到处理,或者因为没有正确配置而没有得到处理。
职责链模式UML类图

C++代码实现
// Handler抽象类,用于定义接口 #ifndef _HANDLER_HPP #define _HANDLER_HPP class Handler{ public: virtual void setSuccessor(Handler* h) = 0; virtual void handleRequest(int req) = 0; }; #endif
//ConcreteHandler1类 #ifndef _CONCRETEHANDLER1_HPP #define _CONCRETEHANDLER1_HPP #include"handler.hpp" #include<iostream> using namespace std; class ConcreteHandler1:public Handler{ public: virtual void setSuccessor(Handler* h) override { hdl = h; }; virtual void handleRequest(int req) override { if(0 <= req && req < 10){ cout << "[0,10) is handled by handler1" << endl; } else{ if(!hdl){ cout << "no successor found in ConcreteHandler1 object, requst can't be handled." << endl; } else{ hdl->handleRequest(req); } } } ; private: Handler* hdl; }; #endif
//ConcreteHandler2类 #ifndef _CONCRETEHANDLER2_HPP #define _CONCRETEHANDLER2_HPP #include"handler.hpp" #include<iostream> using namespace std; class ConcreteHandler2:public Handler{ public: virtual void setSuccessor(Handler* h) override { hdl = h; }; virtual void handleRequest(int req) override { if(10 <= req && req < 20){ cout << "[10,20) is handled by handler2" << endl; } else{ if(!hdl){ cout << "no successor found in ConcreteHandler2 object, requst can't be handled." << endl; } else{ hdl->handleRequest(req); } } } ; private: Handler* hdl; }; #endif
// ConcreteHandler3 类 #ifndef _CONCRETEHANDLER3_HPP #define _CONCRETEHANDLER3_HPP #include"handler.hpp" #include<iostream> using namespace std; class ConcreteHandler3:public Handler{ public: virtual void setSuccessor(Handler* h) override { hdl = h; }; virtual void handleRequest(int req) override { if(20 <= req && req < 30){ cout << "[20,30) is handled by handler3" << endl; } else{ if(!hdl){ cout << "no successor found in ConcreteHandler3 object, requst can't be handled." << endl; } else{ hdl->handleRequest(req); } } } ; private: Handler* hdl; }; #endif
// 客户端代码 #include<iostream> #include"concretehandler1.hpp" #include"concretehandler2.hpp" #include"concretehandler3.hpp" using namespace std; int main(){ ConcreteHandler1* conHdl1 = new ConcreteHandler1(); ConcreteHandler2* conHdl2 = new ConcreteHandler2(); ConcreteHandler3* conHdl3 = new ConcreteHandler3(); conHdl1->setSuccessor(conHdl2); conHdl2->setSuccessor(conHdl3); conHdl3->setSuccessor(nullptr); int req = 5; conHdl1->handleRequest(req); req = 15; conHdl1->handleRequest(req); req = 25; conHdl1->handleRequest(req); req = 35; conHdl1->handleRequest(req); getchar(); return 0; }
运行结果:

浙公网安备 33010602011771号