标签:
模式动机(Chain of Responsibility Pattern):对于某个请求,有多个接收者都可能处理,将这样的接收者链接成一个单向链表,根据不同的请求类型决定最终由哪个结点负责处理。不同结点需要维护一个指向下一个结点的链接,该链接可以通过构造结点时传入,也可以通过结点接口指定下一个接收结点。抽象类负责定义公共接口及其默认实现。
模式结构图:
模式代码:
bt_职责链模式.h:
1 #ifndef RP_H 2 #define RP_H 3 #include <iostream> 4 using namespace std; 5 6 /* 7 抽象处理接口 8 */ 9 class Handler 10 { 11 public: 12 virtual ~Handler(){ } 13 void setSuccessor(Handler* successor) 14 { 15 this->successor = successor; 16 } 17 virtual void HandleRequest(int requestNum) 18 { 19 if(successor != NULL) 20 successor->HandleRequest(requestNum); 21 else 22 return ; 23 } 24 25 private: 26 Handler* successor; 27 }; 28 29 /* 30 具体处理类A,处理范围:< 100 31 */ 32 class ConcreteHandlerA : public Handler 33 { 34 public: 35 virtual void HandleRequest(int requestNum) 36 { 37 if(requestNum < 100) 38 cout << "类A处理完毕" << endl; 39 else 40 { 41 cout << "类A不能处理,正在转发请求中..." << endl; 42 Handler::HandleRequest(requestNum); 43 } 44 45 } 46 }; 47 48 /* 49 具体处理类B,处理范围:< 200 50 */ 51 class ConcreteHandlerB : public Handler 52 { 53 public: 54 virtual void HandleRequest(int requestNum) 55 { 56 if(requestNum < 200) 57 cout << "类B处理完毕" << endl; 58 else 59 { 60 cout << "类B不能处理,正在转发请求中..." << endl; 61 Handler::HandleRequest(requestNum); 62 } 63 64 } 65 }; 66 67 /* 68 具体处理类C,处理范围:整个int范围 69 */ 70 class ConcreteHandlerC : public Handler 71 { 72 public: 73 virtual void HandleRequest(int requestNum) 74 { 75 cout << "类C处理完毕" << endl; 76 } 77 }; 78 79 #endif // RP_H
测试用例.cpp:
1 #include "bt_职责链模式.h" 2 3 int main() 4 { 5 cout << "***** 职责链模式 *****" << endl; 6 Handler* pHA = new ConcreteHandlerA; 7 Handler* pHB = new ConcreteHandlerB; 8 Handler* pHC = new ConcreteHandlerC; 9 pHA->setSuccessor(pHB); 10 pHB->setSuccessor(pHC); 11 cout << "---------------------------" << endl; 12 int requestNum = 50; 13 pHA->HandleRequest(requestNum); 14 cout << "---------------------------" << endl; 15 requestNum = 100; 16 pHA->HandleRequest(requestNum); 17 cout << "---------------------------" << endl; 18 requestNum = 300; 19 pHA->HandleRequest(requestNum); 20 21 22 delete pHC; 23 delete pHB; 24 delete pHA; 25 26 return 0; 27 }
模式分析:
当系统中有多个对象可以处理某类请求时,适合使用职责链模式。该模式中,抽象类负责定义处理请求的公共接口,链中的具体处理结点负责处理客户请求。当前一个结点不能处理时,将请求传递到下一个结点中,依次类推。主要优点是降低了系统的耦合性,缺点是在比较长的职责链中,响应速度可能比较慢。
标签:
原文地址:http://www.cnblogs.com/benxintuzi/p/4558086.html