• 【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() 方法。当请假天数超过每个处理器所能处理的范围时,将请求传递给下一个处理器,直到有一个处理器能够处理该请求。

    结论

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

    应用场景

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

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

  • 相关阅读:
    Ultralytics(YoloV8)开发环境配置,训练,模型转换,部署全流程测试记录
    怎么恢复永久删除的文件?这3个方法很实用!
    Libra R-CNN: Towards Balanced Learning for Object Detection(2019.4)
    Shell编程之第一讲——基础知识认识
    数据结构与算法_二叉搜索树
    Python和Numpy的加权抛硬币游戏的概率
    编程小白的自学笔记十七(python办公自动化操作EXCEL表格之作图)
    tinyxml
    mysql创建用户
    【贪心基本算法】贪心算法常见题目
  • 原文地址:https://blog.csdn.net/MrHHHHHH/article/details/133659023