职责链模式将对象的请求处理组成链式结构,并将请求按链式结构逐个传递下去,直接被其中的某个处理者处理为止。由此可知,职责链模式的适用场合是对指定请求,可以有多个请求处理者(或称为请求响应者),但用户并不知道(也不需要知道--------此如做到请求者与响应者的解耦合)当时运行环境下该请求会被具体的哪个处理者处理(又或者说完全都没有被响应)。请求者只是抛出一个请求,响应链内部(即:模式内部)自己决定是否能处理以及谁能处理该请求。该模式的类结构图参考如下:

【行为型】Chain of responsibility模式

    模式的编码结构参考如下:

 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
职责链模式编码结构参考

相关文章:

  • 2021-05-17
  • 2021-06-09
  • 2021-06-20
  • 2021-07-21
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-02
猜你喜欢
  • 2022-01-15
  • 2022-01-18
  • 2021-09-09
  • 2021-05-09
  • 2022-12-23
  • 2021-08-19
  • 2021-12-04
相关资源
相似解决方案