设置模式之责任链模式

news2024/9/28 19:17:10

目录

1.概述

2.结构

3.实现

4.总结


1.概述

责任链模式(Chain of Responsibility Pattern)是一种行为性设计模式;它为请求创建了一个接收者对象的链,允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。这种处理方法类似包与包之间的调用的思路,只是其可以不在主程序中累赘的去申明一堆if else变量使得程序更加臃肿。在我的博客C++之多层 if-else-if 结构优化(二)_c++ 怎么优化很多if 的代码呢-CSDN博客

中就是利用责任链模式来消除多层if-else-if。

2.结构

        责任链模式的重点是在“ 上,由一条链去处理相似的请求在链中决定谁来处理这个请 求,并返回相应的结果,其通用类图如下图 所示:

角色定义:

抽象处理者(Handler)定义一个处理请求的接口,通常包含一个处理请求的方法(如 handleRequest)和一个指向下一个处理者的引用(后继者),一般这类情况class内部都是纯虚函数。

具体处理者(ConcreteHandler)实现了抽象处理者接口,负责处理请求。如果能够处理该请求,则直接处理;否则,将请求传递给下一个处理者;这样可以通过设计整个逻辑链避免混乱。

客户端(Client)创建处理者对象,并将它们连接成一条责任链。通常,客户端只需要将请求发送给责任链的第一个处理者,无需关心请求的具体处理过程。

3.实现

以公司的请假为例,普通员工请假小于等于2天只需要自己的组长同意,请假大于2天小于等于5天需要部门经理同意,大于5天小于10天需要公司总经理同意才行,大于10天的请不了。根据上面的需求,我们可以先抽象Handler,再定义组长、部门经理、总经理,代码如下:

#include <iostream>
using namespace std;

//抽象处理者
class Handler
{
public:
    explicit Handler() { m_pNextHandler = NULL; }
    virtual ~Handler() {}

    //设置下一个处理者
    void setNextHandler(Handler *successor) { m_pNextHandler = successor; }

    //处理请求
    virtual void HandleRequest(int days) = 0;
protected:
    Handler *m_pNextHandler;  // 后继者
};


//组长
class CGroupLeader : public Handler
{
public:
    //处理请求
    void HandleRequest(int days) override
    {
        if (days <= 2)
        {
            cout << "我是组长,有权批准" << days << "天假,同意了!" << endl; 
        }
        else
        {
            m_pNextHandler->HandleRequest(days);
        }
    }
};

//部门经理
class CDeptManager : public Handler
{
public:
    //处理请求
    void HandleRequest(int days)  override
    {
        if (days <= 5)
        {
            cout << "我是部门经理,有权批准" << days << "天的假,同意了!" << endl;
        }
        else
        {
            m_pNextHandler->HandleRequest(days);
        }
    }
};

//总经理
class  CGeneralManager : public Handler
{
public:
    //处理请求
    void HandleRequest(int days) override
    {
        if (days <= 10)
        {
            cout << "我是总经理,最多让你请10天假,同意了!" << endl;
        }
        else
        {
            cout << "你请的假时间太长了,不同意!" << endl;
        }
    }
};

测试用例:

#include <memory>

int main()
{
    std::unique_ptr<Handler> pGroupLeader = new CGroupLeader;
    std::unique_ptr<Handler> pDeptLeader = new CDeptManager;
    std::unique_ptr<Handler> pGeneralManager = new CGeneralManager;

    //设置责任链
    pGroupLeader->setNextHandler(pDeptLeader.get());
    pDeptLeader->setNextHandler(pGeneralManager.get());

    pGroupLeader->HandleRequest(1);
    pGroupLeader->HandleRequest(2);
    pGroupLeader->HandleRequest(5);
    pGroupLeader->HandleRequest(8);
    pGroupLeader->HandleRequest(12);
    return 0;
}

输出:

我是组长,有权批准1天假,同意了!
我是组长,有权批准2天假,同意了!
我是部门经理,有权批准5天的假,同意了!
我是总经理,最多让你请10天假,同意了!
你请的假时间太长了,不同意!

4.总结

优点:

1) 解耦责任链模式将请求的发送者和接收者解耦,请求的发送者不需要知道接收者是谁,也不需要创建接收者的实例。同时,接收者也不需要知道请求的具体内容,只需要按照自已的业务逻辑进行相应的处理。这种解耦方式使得系统更加灵活,降低了耦合度,方便进行模块化开发和测试。
2) 链式处理:责任链模式可以形成一个处理链,请求在这个链中传递,每个节点都会对请求进行处理,这种方式可以实现复杂的业务逻辑,提高系统的可扩展性和可维护性。
3) 动态添加节点:在运行时,可以通过动态添加或册除节点来改变处理链,从而实现动态地扩展或修改处理逻辑。这种动态性使得系统更加灵活,能够适应不同的需求变化。


缺点:
1) 错误传播:在责任链模式中,如果某个节点处理请求时出现了错误,这个错误会沿看处理链向上传播,可能会导致整个链路崩溃。为了解决这个问题,需要确保每个节点都进行了错误处理,能够在出现错误时进行适当的处理或回退操作。
2) 无法终止链路:在某些情况下,如果请求不满足某个节点的条件,该节点就不需要对请求进行处理,但责任链模式无法直接终止链路。为了解决这人问题,可以在节点中添加判断逻辑,当请求不满足条件时直接返可或者进行其他处理。
3) 性能问题:由于请求会在多个节点间传递,因此责任链模式的性能可能会受到影响。特别是在请求量较大或处理逻辑较复杂的情况下,这种影响会更加明显。为了解决这个问题,可以对节点进行优化,提高处理效率,同时也可以考虑使用缓存等方式来降低请求的重复处理。
4) 节点之间的依频关条:在责任链模式中节点之间存在依赖关系,如果桌个节点的处理逻辑发生了变化,可能会影响到其他节点。这种依频关系可能会导致系统复杂度增加,增加了维护的难度。为了避免这种情况,可以尽量减少节点之间的依赖关系,使每个节点都尽可能独立地处理请
求。同时也可以采用模块化设计等方式来降低系统复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1410545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

list的介绍及其模拟实现

今天我们了解list&#xff0c;list在python中是列表的意思 &#xff0c;但是在C中它是一个带头双向循环链表&#xff1a; list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xf…

1.25学习总结

今天学习了二叉树&#xff0c;了解了二叉树的创建和遍历的过程 今天所了解的遍历过程主要分为三种&#xff0c;前序中序和后序&#xff0c;都是DFS的想法 前序遍历&#xff1a;先输出在遍历左节点和右节点&#xff08;输出->左->右&#xff09; 中序遍历&#xff1a;先…

2024传薪文化盛大启航 年度论坛暨新春年会圆满举办

2024年1月20日下午, 由创人文/传薪文化理事会与长三角美好生活创新联盟主办,由传薪文化、九鲲文化承办的“文脉传万象薪”传薪&美创联2024甲辰年度论坛暨新春年会,在上海成功举办。来自学界、文化、经济和艺术等领域的社会精英人士170余人齐聚一堂,从历史和传承中汲取营养,…

elementplus 中 DatePicker 日期选择器样式修改无效

问题 遇到一个需求需要修改 DatePicker 日期选择器的样式&#xff0c;在添加了 scoped 属性的 style 标签&#xff0c;并且使用了 deep 样式穿透的情况下并不能修改其样式。 原因 DatePicker 日期选择器弹出面板默认挂载在 body 上&#xff0c;所以在组件中添加了 scoped 属…

MFC扩展库BCGControlBar Pro v34.0 - 图形管理器功能升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v34.0已正式发布了&#xff0c;该版本包括新的主题任务对话框、图像效果、旋转圆形刻度、…

【操作系统】实验六 分析源代码

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Python爬虫 l 中国农药信息网的农药登记数据

一、爬取目标 二、完整源码 #""""""""""""""""""""""""""""""""""""""…

Docker网络及资源控制

目录 1.Docker网络 Docker网络实现原理 Docker的网络模式 host模式 container模式 none模式 bridge模式 自定义网络 2.资源控制 CPU资源控制 设置CPU使用率上限 设置CPU资源占用比 设置容器绑定指定的CPU 对内存使用的限制 对磁盘IO配额控制&#xff08;blkio&a…

泰迪科技最新大数据法律监督模型解决方案

大数据法律监督平台是基于监督数据整合管理平台、监督模型构建平台、内置模型库以及法律监督线索管理平台打造的一套服务于检察机关法律监督工作的专业化系统。通过数据采集、融合、挖掘、建模、展现等一系列能力&#xff0c;辅助检察官从纷繁复杂的数据中&#xff0c;开展多维…

手拉手JavaFX UI控件与springboot3+FX桌面开发

目录 javaFx文本 javaFX颜色 字体 Label标签 Button按钮 //按钮单击事件 鼠标、键盘事件 //(鼠标)双击事件 //键盘事件 单选按钮RadioButton 快捷键、键盘事件 CheckBox复选框 ChoiceBox选择框 Text文本 TextField(输入框)、TextArea文本域 //过滤 (传入一个参数&a…

【嵌入式学习】C++QT-Day1-C++基础

思维导图&&笔记 见我的博客&#xff1a;https://lingjun.life/wiki/EmbeddedNote/19Cpp 作业&#xff1a; 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream&…

【K8S】Service使用NodePort对外暴露应用

一、背景介绍 Pod是有生命周期的&#xff0c;当一个工作节点(node)销毁时&#xff0c;节点上运行的pods也会被销毁。ReplicationController会动态地在其他节点上创建Pod来保持应用程序的运行&#xff0c;每一个Pod都有一个独立的IP地址&#xff0c;甚至是同一个节点上的Pod。可…

软件安装SQLyog

SQLyog 安装配置使用 首先下载SQLyog 软件&#xff0c;并解压 选择自己操作系统的版本 双击点击 .exe 文件&#xff0c;进行安装 选择安装语言&#xff0c;默认中文&#xff0c;直接点击【OK】即可 点击【下一步】 先【勾选】同意协议&#xff0c;再点击【下一步】 …

男主角展现炸裂演技,演绎方式独具匠心,令人叹为观止

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 在漫长的等待之后&#xff0c;《要久久爱》这部都市情感剧终…

图中点的层次——树与图的广度优先遍历

问题描述 代码实现 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 1e5 10;int n, m; int h[N], ne[N * 2], e[N * 2], idx; int d[N]; // 从节点1到当前节点的距离 int q[N * 2]; // 数组模拟队列void ad…

西安石油大学C++上机实验汇总

考试题难度就像第三章第五章课后题的难度 基础知识一定要掌握&#xff01;&#xff01;&#xff01; 上机一&#xff1a;类与对象程序设计&#xff08;2 学时&#xff09; 上机目的 掌握声明类的方法。掌握类和类的成员的概念以及定义对象的方法。掌握构造函数和析构函数的…

Salesforce Lightning 的 Close Case 按钮无法批量关闭 Case 的原因和解决方法

为 Lightning 页面添加了自定义的 Close Case 按钮&#xff08;方法可参考&#xff1a;https://www.simplysfdc.com/2021/01/salesforce-mass-close-case.html&#xff09;后&#xff0c;可能会出现无法批量关闭 Case 的情况。 选中多个 Case&#xff0c;再点击 Close Case 按…

微信小程序开发position等于static、relative、absolute、fixed、stricky时元素显示详细介绍

No Position 不设置position时显示,以红色元素做测试: Static 元素根据界面正常流进行定位。top、right、bottom、left 和 z-index 属性不起作用。这是默认值。 红色元素设置position: static,显示如下: Relative 元素根据界面正常流进行定位。以元素当前位置为基准,根…

C语言和C++中不定参数解析

你所看到的惊艳&#xff0c;都曾被平庸历练 文章目录 简介C语言不定参数不定参宏函数 C不定参数方法一&#xff1a;递归展开方式二&#xff1a;折叠表达式方法三&#xff1a;逗号表达式 总结 简介 相信学过c/c的佬们都知道&#xff0c;如果一个函数将自己的参数确定好后&#…

泛微智能公文,为党政机关配备一位7*24小时公文助手,办文更高效

政务数字化智能水平明显提升是数字中国建设目标之一&#xff0c;平台化、智能化已成为政务协同办公的未来发展趋势&#xff0c;政府机关持续加强新技术全流程应用。 公文办理作为党政机关单位日常工作任务中重要的一环&#xff0c;泛微在全程数字化的公文管理体系中融入智能化技…