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


    简介

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

    描述

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

    原理

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

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

    类图

    在这里插入图片描述

    示例

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

    #include 
    
    // 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71

    输出结果

    总经理通过审批
    
    • 1

    解释

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

    结论

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

    应用场景

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

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

  • 相关阅读:
    Redis查看集群状态有节点显示fail,连接失败
    Linux—磁盘管理
    Session会话机制的应用(用户登录)
    民安智库(第三方满意度调研公司)购物商场消费者满意度研究报告
    程序开发中表示密码时使用 password 还是 passcode?
    【STM32】【HAL库】【实用制作】数控收音机(软件设计)
    Java 重写、重载,这篇文章看了就明白
    经典设计原则 - SOLID
    FBX文件结构解读【文本格式】
    es实操笔记
  • 原文地址:https://blog.csdn.net/MrHHHHHH/article/details/133659023