• 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 }
    
    

    模式分析:

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

     

     

  • 相关阅读:
    Jenkins+ansible+Gitlab集成环境搭建
    Jenkins 和常用工具集成
    Jenkins 安装部署及应用
    ansible 及相关应用
    gitlab 快速安装
    [持续交付实践] 交付流水线设计:基于测试脚本的线上拨测监控系统
    gitlab CICD
    Nginx判断UserAgent添加referer
    Nginx判断变量的配置
    golang 入门之环境搭建
  • 原文地址:https://www.cnblogs.com/benxintuzi/p/4558086.html
Copyright © 2020-2023  润新知