1. 责任链模式的核心价值与应用场景
在软件开发中,我们经常遇到需要将请求按特定顺序传递给多个处理对象的场景。比如请假审批流程中,1天内的假期由组长审批,3天内由经理审批,超过3天则需要总监批准。如果用传统的if-else嵌套实现,代码会变得难以维护:
cpp复制if (days <= 1) {
teamLeader.approve();
} else if (days <= 3) {
manager.approve();
} else {
director.approve();
}
这种实现方式存在三个明显问题:
- 审批逻辑与业务代码高度耦合
- 新增审批层级需要修改原有代码
- 客户端需要了解完整的审批流程
责任链模式通过将处理对象连成一条链,让请求沿着这条链传递,直到被某个对象处理为止。这种设计带来三个核心优势:
- 解耦请求发送者和接收者
- 动态调整处理流程
- 符合开闭原则(对扩展开放,对修改关闭)
典型应用场景包括:
- 多级审批系统(请假、报销等)
- 日志级别处理(DEBUG → INFO → WARN → ERROR)
- Web请求过滤器链(认证 → 授权 → 日志 → 限流)
- 异常处理流程
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C++实现责任链模式的核心架构
2.1 模式角色划分
责任链模式包含三个核心角色:
-
抽象处理者(Handler)
- 定义处理请求的接口
- 持有下一个处理者的引用
- 提供设置下一个处理者的方法
-
具体处理者(ConcreteHandler)
- 实现具体的处理逻辑
- 决定是否处理请求或传递给下一个处理者
- 通常包含处理条件的判断
-
客户端(Client)
- 构建处理链
- 发起处理请求
- 无需关心具体处理细节
2.2 类关系设计
在C++中,我们使用抽象基类和智能指针来实现这一模式:
cpp复制class Handler {
protected:
std::shared_ptr<Handler> next;
public:
virtual ~Handler() = default;
void setNext(std::shared_ptr<Handler> handler) {
next = handler;
}
virtual void handleRequest(const Request& req) = 0;
};
具体处理者继承该基类并实现处理逻辑:
cpp复制class ConcreteHandlerA : public Handler {
public:
void handleRequest(const Request& req) override {
if (canHandle(req)) {
// 处理请求
} else if (next) {
next->handleRequest(req);
}
}
};
3. 完整实现:请假审批系统
3.1 请求对象定义
首先定义请假请求数据结构:
cpp复制class LeaveRequest {
public:
std::string employeeName;
int leaveDays;
std::string reason;
LeaveRequest(const std::string& name, int days, const std::string& r = "")
: employeeNam
