找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2464

积分

0

好友

352

主题
发表于 昨天 01:26 | 查看: 2| 回复: 0

职责链模式是一种经典的行为型设计模式。它能让你将请求沿着一个处理器链进行传递。链上的每个处理器都可以选择处理该请求,或者将其传递给下一个处理器。这样一来,请求的发送者和接收者之间就实现了松耦合。

核心特点

  1. 多个对象都有机会处理同一个请求,但具体由谁处理在运行时决定;
  2. 请求沿着预定义的链传递,直到被某个处理者处理或到达链尾;
  3. 发送者无需知道链的具体结构和处理者,这符合设计模式中的“开闭原则”。

使用此模式可以达到以下目的

  1. 解耦:消除请求发送者与多个处理者之间的强绑定关系。发送者无需关心处理者的数量、类型和具体规则。
  2. 扩展:处理规则和流程可以灵活调整。新增或修改处理者时,通常不需要改动已有代码,这很好地实践了“开闭原则”。
  3. 简化:将分散的处理逻辑收敛到各个具体的处理者类中,使得整个请求的分发和处理流程更加清晰,易于维护。

UML结构

要理解职责链模式,UML类图是最直观的方式。它展示了抽象处理器与具体处理器之间的继承关系,以及链式连接的实现方式。

职责链模式UML类图

应用示例:请假审批流程

我们用一个常见的“请假审批流程”作为场景,用 C++ 实现职责链模式。假设规则如下:

  1. 小组长:只能审批 1 天及以内的请假;
  2. 部门经理:能审批 1 天以上,3 天及以内的请假;
  3. 总经理:能审批 3 天以上的请假。

首先,我们定义抽象处理者基类 Approver,它定义了设置后继处理者和处理请求的接口。

#include <iostream>
#include <string>

// 抽象处理者类
class Approver
{
protected:
    Approver* _nextApprover; // 下一个处理者
    std::string _name; // 处理者名称
public:
    Approver(const std::string& name)
        : _nextApprover(nullptr), _name(name) {}

    // 设置下一个处理者(返回自身支持链式调用)
    Approver* SetNext(Approver* approver)
    {
        _nextApprover = approver;
        return approver;
    }

    // 抽象处理方法
    virtual void HandleRequest(int days) = 0;
    virtual ~Approver() = default;
};

接着,实现第一个具体处理者:GroupLeader(小组长)。它的处理逻辑是:如果请假天数小于等于1天,则自行审批;否则,将请求转发给链上的下一个处理者。

C++职责链代码示例:抽象类与小组长实现

然后,我们实现 DepartmentManager(部门经理)和 GeneralManager(总经理)。它们的逻辑类似,只是审批权限的天数范围不同。

C++职责链代码示例:部门经理与总经理实现

最后,在 main 函数中,我们创建具体的处理者对象,并将它们链接成一条职责链,然后测试不同的请假场景。

int main()
{
    // 创建处理者
    Approver* groupLeader = new GroupLeader("小组长-张三");
    Approver* deptManager = new DepartmentManager("部门经理-李四");
    Approver* genManager = new GeneralManager("总经理-王五");

    // 构建职责链:小组长→部门经理→总经理
    groupLeader->SetNext(deptManager)->SetNext(genManager);

    // 测试不同的请假天数
    std::cout << "=== 测试1天请假 ===" << std::endl;
    groupLeader->HandleRequest(1);

    std::cout << "\n=== 测试2天请假 ===" << std::endl;
    groupLeader->HandleRequest(2);

    std::cout << "\n=== 测试5天请假 ===" << std::endl;
    groupLeader->HandleRequest(5);

    // 释放内存
    delete groupLeader;
    delete deptManager;
    delete genManager;

    return 0;
}

构建与测试职责链的C++主函数代码

运行结果

编译并运行上述程序,你可以清晰地看到请求是如何根据天数在不同层级的审批者间传递的。

职责链模式C++示例运行结果输出

总结

  1. 职责链模式的核心在于请求沿着一条处理器链传递,每个处理器自行决定处理还是转发。它主要用于解耦请求的发送者和多个潜在的接收者。
  2. 在本文的 C++ 实现中,抽象处理者定义了核心接口,具体处理者实现各自的业务逻辑,并通过 _nextApprover 指针来维护链式结构。这种设计模式在处理多级流程、过滤器、拦截器等场景中非常有用。

掌握设计模式是构建灵活、可维护软件系统的关键一步。如果你想了解更多关于系统架构和编程思想的内容,欢迎在 云栈社区 进行交流探讨。




上一篇:Mimiri Notes:开源跨平台笔记如何确保隐私并实现多端实时同步?
下一篇:CAP定理、BASE理论与FLP原理:构建高可用系统的三大基石
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-16 03:38 , Processed in 0.466402 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表