职责链模式是一种经典的行为型设计模式。它能让你将请求沿着一个处理器链进行传递。链上的每个处理器都可以选择处理该请求,或者将其传递给下一个处理器。这样一来,请求的发送者和接收者之间就实现了松耦合。
核心特点
- 多个对象都有机会处理同一个请求,但具体由谁处理在运行时决定;
- 请求沿着预定义的链传递,直到被某个处理者处理或到达链尾;
- 发送者无需知道链的具体结构和处理者,这符合设计模式中的“开闭原则”。
使用此模式可以达到以下目的
- 解耦:消除请求发送者与多个处理者之间的强绑定关系。发送者无需关心处理者的数量、类型和具体规则。
- 扩展:处理规则和流程可以灵活调整。新增或修改处理者时,通常不需要改动已有代码,这很好地实践了“开闭原则”。
- 简化:将分散的处理逻辑收敛到各个具体的处理者类中,使得整个请求的分发和处理流程更加清晰,易于维护。
UML结构
要理解职责链模式,UML类图是最直观的方式。它展示了抽象处理器与具体处理器之间的继承关系,以及链式连接的实现方式。

应用示例:请假审批流程
我们用一个常见的“请假审批流程”作为场景,用 C++ 实现职责链模式。假设规则如下:
- 小组长:只能审批 1 天及以内的请假;
- 部门经理:能审批 1 天以上,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天,则自行审批;否则,将请求转发给链上的下一个处理者。

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

最后,在 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++ 实现中,抽象处理者定义了核心接口,具体处理者实现各自的业务逻辑,并通过
_nextApprover 指针来维护链式结构。这种设计模式在处理多级流程、过滤器、拦截器等场景中非常有用。
掌握设计模式是构建灵活、可维护软件系统的关键一步。如果你想了解更多关于系统架构和编程思想的内容,欢迎在 云栈社区 进行交流探讨。
|