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

简介

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

描述

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

原理

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

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

类图

示例

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

cpp 复制代码
#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;
}

输出结果

cpp 复制代码
总经理通过审批

解释

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

结论

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

应用场景

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

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

相关推荐
Humbunklung26 分钟前
unordered_map使用MFC的CString作为键值遇到C2056和C2064错误
c++·stl·mfc
lpfasd1231 小时前
第2课:Agent系统架构与设计模式
设计模式·系统架构
爱编程的化学家1 小时前
代码随想录算法训练营第十一天--二叉树2 || 226.翻转二叉树 / 101.对称二叉树 / 104.二叉树的最大深度 / 111.二叉树的最小深度
数据结构·c++·算法·leetcode·二叉树·代码随想录
眠りたいです2 小时前
基于脚手架微服务的视频点播系统-数据管理与网络通信部分的预备工作
c++·qt·ui·微服务·云原生·架构·媒体
烦躁的大鼻嘎2 小时前
【Linux】深入Linux多线程架构与高性能编程
linux·运维·服务器·开发语言·c++·ubuntu
野生的编程萌新2 小时前
【C++深学日志】C++编程利器:缺省参数、函数重载、引用详解
c语言·开发语言·c++
愚润求学2 小时前
【贪心算法】day10
c++·算法·leetcode·贪心算法
智者知已应修善业3 小时前
【矩阵找最大小所在位置】2022-11-13
c语言·c++·经验分享·笔记·算法·矩阵
小柯J桑_3 小时前
C++之特殊类设计
java·开发语言·c++
bikong74 小时前
Qt/C++,windows多进程demo
c++·windows·qt