14 行为型模式-----职责链模式

模式动机(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 }

模式分析:

当系统中有多个对象可以处理某类请求时,适合使用职责链模式。该模式中,抽象类负责定义处理请求的公共接口,链中的具体处理结点负责处理客户请求。当前一个结点不能处理时,将请求传递到下一个结点中,依次类推。主要优点是降低了系统的耦合性,缺点是在比较长的职责链中,响应速度可能比较慢。

 

 

原文地址:https://www.cnblogs.com/benxintuzi/p/4558086.html