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

news/2024/5/19 12:15:40 标签: c++, 设计模式, 责任链模式

简介

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

描述

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

原理

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

  • 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.niftyadmin.cn/n/5071349.html

相关文章

利用fitnesse实现api接口自动化测试

上午在园子里乱逛&#xff0c;看了不少小伙伴们分享的接口测试方面的知识&#xff0c;仔细想想&#xff0c;我做接口测试也有几个年头了&#xff0c;大家所叙述到的一些经验或多或少&#xff0c;我也曾遇到过&#xff0c;突然意识到知识的点滴积累是多么的重要&#xff0c;我记…

8.2 JUC - 4.Semaphore

目录 一、是什么&#xff1f;二、简单使用三、semaphore应用四、Semaphore原理 一、是什么&#xff1f; Semaphore&#xff1a;信号量&#xff0c;用来限制能同时访问共享资源的线程上限 二、简单使用 public class TestSemaphore {public static void main(String[] args) …

MySQL实战基础知识入门(13):数据类型

MySQL实战基础知识入门 MySQL实战基础知识入门(1)&#xff1a;登录数据库命令行MySQL实战基础知识入门(2)&#xff1a;统计一天24小时数据默认补0的sql语句MySQL实战基础知识入门(3)&#xff1a;近7日销量合计php后端mysql语句如果当日为空则自动补0的解决方案MySQL实战基础知…

精确到区县级街道乡镇行政边界geojson格式矢量数据的获取拼接实现Echarts数据可视化大屏地理坐标信息地图的解决方案

在Echarts制作地理信息坐标地图时&#xff0c;最麻烦的就是街道乡镇级别的行政geojson的获取&#xff0c; 文件大小 788M 文件格式 .json格式&#xff0c;由于是大文件数据&#xff0c;无法直接使用记事本或者IDE编辑器打开&#xff0c;推荐Dadroit Viewer&#xff08;国外…

背靠背 HVDC-MMC模块化多电平转换器输电系统-用于无源网络系统的电能质量调节(Simulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

2.2 数据通信的基础知识

前言&#xff1a; 2.2.1 数据通信的基础知识 **笔记**&#xff1a;2.2.1 数据通信系统的模型 --- **1. 数据通信系统组成**&#xff1a; - 三大部分&#xff1a; 1. 源系统 (发送端) 2. 传输系统 (传输网络) 3. 目的系统 (接收端) --- **2. 源系统**&#xff1a; -…

校招秋招,性格和职业有关系吗?

企业在招聘应届毕业生时不再局限于普通的面试或者笔试&#xff0c;在互联网时代&#xff0c;为了能够更好的匹配需要的优质人才&#xff0c;企业会通过各种测试来提高招聘的准确率以及成功率。也许以前很多人都听说过性格和职业是有一定关系的&#xff0c;但是如何确定自己的性…

windows内核编程(2021年出版)笔记

1. Windows内部概览 1.1 进程 进程包含以下内容&#xff1a; 可执行程序&#xff0c;代码和数据私有的虚拟地址空间&#xff0c;分配内存时从这里分配主令牌&#xff0c;保存进程默认安全上下文&#xff0c;进程中的线程执行代码时会用到它私有句柄表&#xff0c;保存进程运…