【C++设计模式之责任链模式:行为型】分析及示例

news2024/12/23 4:28:38

简介

责任链模式是一种行为型设计模式,它允许将请求沿着处理链传递,直到有一个处理器能够处理该请求。这种模式将请求的发送者和接收者解耦,同时提供了更高的灵活性和可扩展性。

描述

责任链模式由多个处理器组成一个处理链,每个处理器负责处理特定类型的请求。当请求到达链中的一个处理器时,它可以选择处理请求,将请求传递给下一个处理器,或者终止请求的传递。

原理

责任链模式包含以下几个关键角色:

  • Handler(处理器):定义了处理请求的接口,并持有下一个处理器的引用。
  • ConcreteHandler(具体处理器):实现了Handler接口,具体处理请求的逻辑。如果能处理请求,则处理;否则将请求传递给下一个处理器。

类图

在这里插入图片描述

示例

以请假审批为例。有一个请假审批系统,由三个处理器组成,分别是部门经理、总经理和人事经理。部门经理能够处理1天以内的请假请求,总经理能够处理3天以内的请假请求,人事经理能够处理7天以内的请假请求。如果请假天数超过7天或者没有合适的处理器处理该请求,则审批不通过。

#include <iostream>

// Handler(处理器)
class Approver {
public:
    Approver* next; // 下一个处理器
    
    virtual void processRequest(int days) = 0;
};

// ConcreteHandler(具体处理器)
class DepartmentManager : publicver {
public:
    void processRequest(int days) {
        if (days <= 1) {
            std::cout << "部门经理通过审批" << std::endl;
        } else if (next != nullptr) {
            next->processRequest(days);
        } else {
            std::cout << "审批不通过" << std::endl;
        }
    }
};

class GeneralManager : public Approver {
public:
    void processRequest(int days) {
        if (days <= 3) {
            std::cout << "总经理通过审批" << std::endl;
        } else if (next != nullptr) {
            next->processRequest(days);
        } else {
            std::cout << "审批不通过" << std::endl;
        }
    }
};

class HRManager : public Approver {
public:
    void processRequest(int days) {
        if (days <= 7) {
            std::cout << "人事经理通过审批" << std::endl;
        } else if (next != nullptr) {
            next->processRequest(days);
        } else {
            std::cout << "审批不通过" << std::endl;
        }
    }
};

int main() {
    // 创建处理器对象
    Approver*Manager = new DepartmentManager();
    Approver* generalManager = GeneralManager();
    Approver* hrManager = new HRManager();

    // 构处理链
    departmentManager->next = generalManager;
    generalManager->next = hrManager;
    
    // 发起请假申请
    int days = 5; // 请假5天
    departmentManager->processRequest(days);

    // 释放资源
    delete departmentManager;
    delete generalManager;
    delete hrManager;
    
    return 0;
}

输出结果

总经理通过审批

解释

在上述示例中,部门经理、总经理和人事经理分别充当具体处理器,实现了 Approver 接口中的 processRequest() 方法。当请假天数超过每个处理器所能处理的范围时,将请求传递给下一个处理器,直到有一个处理器能够处理该请求。

结论

责任链模式将请求的发送者和接收者解耦,使得它们可以独立变化。同时,责任链模式也提供了一种动态组合处理链的方式,增加了灵活性和可扩展性。

应用场景

  • 有多个对象可以处理请求,并且不确定哪个对象能处理请求时,可以使用责任链模式。
  • 需要避免请求发送者与接收者之间的耦合,以及想防止请求的发送者明确地指定接收者时,可以使用责任链模式。
  • 需要动态组合处理链以及简化处理者之间的交互时。

上述示例模拟了一个请假审批系统,具体处理器哈哈哈,空空如也!

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

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

相关文章

如何批量获取拼多多商品详情数据,拼多多商品详情API接口

批量获取拼多多商品详情数据可以采用以下方式&#xff1a; 使用拼多多开放平台API接口。 拼多多开放平台提供了API接口&#xff0c;可以通过API接口获取拼多多平台上的商品信息&#xff0c;使用API接口需要进行权限申请和认证&#xff0c;操作较为复杂。使用第三方工具。 市面…

Transformer预测 | Pytorch实现基于Transformer的锂电池寿命预测(NASA数据集)

文章目录 效果一览文章概述模型描述程序设计参考资料效果一览 文章概述 Pytorch实现基于Transformer 的锂电池寿命预测,环境为pytorch 1.8.0,pandas 0.24.2 随着充放电次数的增加,锂电池的性能逐渐下降。电池的性能可以用容量来表示,故寿命预测 (RUL) 可以定义如下: SOH(t…

网络安全(黑客)——自学篇

什么是网络安全&#xff1f; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻…

基于FPGA的I2C读写EEPROM

文章目录 前言一、I2C协议1.1 I2C协议简介1.2 物理层1.3 协议层 二、EEPROM2.1 型号及硬件规格2.2 各种读写时序 三、状态机设计四、项目源码&#xff1a;五、实现效果参考资料 前言 本次项目所用开发板FPGA芯片型号为&#xff1a;EP4CE6F17C8 EEPROM芯片型号为&#xff1a;24L…

[C++从入门到精通] 11.回顾类内初始化、默认构造函数、=default

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

Python爬虫(二十二)_selenium案例:模拟登陆豆瓣

本篇博客主要用于介绍如何使用seleniumphantomJS模拟登陆豆瓣&#xff0c;没有考虑验证码的问题&#xff0c;更多内容&#xff0c;请参考&#xff1a;Python学习指南 #-*- coding:utf-8 -*-from selenium import webdriver from selenium.webdriver.common.keys import Keysimp…

辅助寄存器是干什么用的

目录 请问CPU 的 MREQ 引脚和 IORQ 引脚分别是干什么用的 那这里的引脚是什么含义呢&#xff1f; 程序是指令和数据的集合 辅助寄存器是干什么用的 寄存器的用途取决于它的类型 PC 寄存器也叫作“程序指针”&#xff0c;存储着指向 CPU 接下来 要执行的指令的地址。PC 寄存…

jmeter添加断言(详细图解)

先创建一个线程组&#xff0c;再创建一个http请求。 为了方便观察&#xff0c;我们添加两个监听器&#xff0c;察看结果树和断言结果。 添加断言&#xff1a;响应断言&#xff0c;响应断言也是比较常用的一个断言 设置响应断言&#xff1a;正常情况下响应代码是200。选择响应代…

固态硬盘删除的资料能恢复吗?

固态硬盘&#xff08;SSD&#xff09;作为一种存储设备&#xff0c;在读写速度和抗摔性方面具有显著优势&#xff0c;因此备受许多用户的青睐。然而&#xff0c;在使用过程中&#xff0c;由于人为误操作或设备内部故障&#xff0c;固态硬盘可能会导致数据丢失。所以固态硬盘删除…

【WinRAR】去除请购买WinRAR许可

新建rarreg.key文件 在WinRAR安装目录新建rarreg.key文件&#xff0c;文件内容如下: RAR registration datawncnUnlimited Company LicenseUID1b064ef8b57de3ae9b5264122122509b52e35fd885373b214a4a64cc2fc1284b77ed14fa2066ebfca6509f9813b32960fce6cb5ffde62890079861be57…

聊聊分布式架构02——Http到Https

目录 HTTP通信协议 请求报文 响应报文 持久连接 状态管理 HTTPS通信协议 安全的HTTPS HTTP到HTTPS的演变 对称加密 非对称加密 混合加密机制 证书机构 SSL到底是什么 HTTPS是身披SSL外壳的HTTP HTTP通信协议 一次HTTP请求的通信流程&#xff1a;客户端浏览器通过…

slam从入门到精通(稍复杂一点的运动控制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 ros本身只是提供了一个框架&#xff0c;上面对应客户需求&#xff0c;下面对应各个传感器&#xff0c;中间就是各个算法和决策措施。但是robot本身…

SpringCloud之Hystrix高版本熔断器源码解析

Hystrix官方已经停止开发了&#xff0c;Hystrix官方推荐使用新一代熔断器作为Resilience4j。作为新一代的熔断器&#xff0c;Resilience4j有很多优势&#xff0c;比如依赖少&#xff0c;模块化程度较好等优势。 Resilience4j是受Hystrix启发而做的熔断器&#xff0c;通过管理远…

【动手学深度学习】课程笔记 00-03 深度学习介绍及环境配置

目录 00-01 课程安排 02 深度学习介绍 深度学习实际应用的流程 完整的故事 03 环境配置 00-01 课程安排 1. 学习了这门课&#xff0c;你将收获什么&#xff1f; 深度学习的经典和最新模型&#xff1a;LeNet&#xff0c;ResNet&#xff0c;LSTM&#xff0c;BERT&#xff1…

Linux程序崩溃时的信号量(signal)说明

一、概念说明 在程序崩溃的时候&#xff0c;我们将会获取到两个信息: • signal: 信号量&#xff0c;下文将会详细的说明不同的信号量及其含义 • code: 错误码, 除了几个所有信号量(signal) 公共的错误码(code)&#xff0c;一般不同信号量(signal)有特定的错误码(code)&#x…

智能工业通信解决方案!钡铼BL124实现Modbus转Ethernet/IP互联!

钡铼技术BL124 Modbus转Ethernet/IP协议网关是一款专为工业自动化领域而设计的先进设备。它提供了可靠的通信解决方案&#xff0c;能够将Modbus通信协议与Ethernet/IP通信协议进行高效转换&#xff0c;实现不同类型设备之间的无缝集成和通信。 添加图片注释&#xff0c;不超过 …

冲刺十五届蓝桥杯P0004递增三元组

文章目录 题目解析代码如下 题目 递增三元组 解析 用到线性代数的知识&#xff0c;原来的三元组一共有27钟组合&#xff0c;不一一列举了。如果将三元组排序一下&#xff0c;得到的27钟组合和原来时一样的&#xff0c;只是顺序变了而已。 我们以b组为核心&#xff0c;遍历b组…

矢量图绘制软件EazyDraw mac中文版软件介绍

EazyDraw mac是一款功能强大且易于使用的矢量绘图软件。 EazyDraw mac软件介绍 矢量绘图工具&#xff1a;EazyDraw 提供了一套全面的矢量绘图工具&#xff0c;包括直线、曲线、多边形、文本框、图形填充等。用户可以使用这些工具创建和编辑精确的矢量图形&#xff0c;无论是简…

电动主轴与气动主轴的优缺点

随着工业自动化的不断发展&#xff0c;主轴的应用越来越广泛&#xff0c;并且不断改进优化。目前&#xff0c;市面上常用的主轴主要有两种&#xff1a;电动主轴和气动主轴。为了更好地选择和使用主轴&#xff0c;我们需要了解电动主轴和气动主轴各有什么优缺点&#xff1f; 电动…

徐明君:企业管理的新视角,业务与行为的整合

随着社会的发展和科技的进步&#xff0c;企业管理在社会化大生产的背景下愈显重要。近日&#xff0c;在一次企业管理的论坛上&#xff0c;众多业界人士针对企业管理的新视角进行了深入探讨&#xff0c;强调了业务管理和行为管理并重的重要性。 业务管理主要侧重于对企业的各种…