【设计模式】责任链模式(Chain of Responsibility)详解
责任链模式是一种行为设计模式,通过将多个处理对象连接成链来解决请求处理问题。该模式的核心思想是解耦请求发送者和接收者,让请求沿着处理链传递直到被处理。典型结构包括抽象处理者、具体处理者和客户端三部分,适用于审批流程、权限校验等场景。其优点在于灵活性和可扩展性,但存在请求可能未被处理、调试困难等缺点。与命令模式不同,责任链强调处理顺序和多个接收者。该模式在Servlet Filter等框架中有广泛应
·
文章目录
1. 引言:if-else 审批流的噩梦
在很多业务系统中,你可能写过这样的代码:
if (level == 1) {
leader.approve();
} else if (level == 2) {
manager.approve();
} else if (level == 3) {
director.approve();
}
随着规则变化:
- 新增审批人
- 调整审批顺序
- 条件越来越复杂
代码很快就会变成灾难。
责任链模式就是为了解决“请求该交给谁处理”的问题。请求不找人,人来接请求。
2. 什么是责任链模式
GoF 定义
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。
详解:责任链模式,又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
一句话理解:
请求沿着一条链传递,直到有人处理它。
3. 责任链模式的核心思想
责任链模式的关键在于:
- 请求发送者不关心谁处理
- 每个处理者只关心“能不能处理”
- 处理不了就交给下一个
处理逻辑解耦,顺序可配置。
4. 责任链模式的结构
责任链模式通常包含三个角色:
- Handler(抽象处理者)
定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
- ConcreteHandler(具体处理者)
实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
- Client(客户端)
创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
结构示意:
Client → Handler1 → Handler2 → Handler3
5. 示例:请假审批流程
5.1 抽象处理者
public abstract class LeaveHandler {
protected LeaveHandler next; // next可继承
public void setNext(LeaveHandler next) {
this.next = next;
}
public abstract void handle(int days);
}
5.2 具体处理者
public class LeaderHandler extends LeaveHandler {
@Override
public void handle(int days) {
if (days <= 1) {
System.out.println("组长审批通过");
} else if (next != null) {
next.handle(days);
}
}
}
public class ManagerHandler extends LeaveHandler {
@Override
public void handle(int days) {
if (days <= 3) {
System.out.println("经理审批通过");
} else if (next != null) {
next.handle(days);
}
}
}
public class DirectorHandler extends LeaveHandler {
@Override
public void handle(int days) {
if (days <= 7) {
System.out.println("总监审批通过");
} else {
System.out.println("请假天数过长,驳回");
}
}
}
5.3 客户端组装责任链
LeaveHandler leader = new LeaderHandler();
LeaveHandler manager = new ManagerHandler();
LeaveHandler director = new DirectorHandler();
leader.setNext(manager);
manager.setNext(director);
leader.handle(5);
6. 责任链模式的优点
- 请求与处理者解耦
- 易于扩展新节点
- 顺序灵活可配置
- 符合开闭原则
7. 责任链模式的缺点
- 请求可能无人处理
- 调试不直观
- 链条过长影响性能
8. 责任链 vs 命令模式
| 维度 | 责任链模式 | 命令模式 |
|---|---|---|
| 核心 | 处理者链 | 请求对象 |
| 是否有多个接收者 | 是 | 否 |
| 是否强调顺序 | 是 | 否 |
9. JDK 中的责任链模式
Servlet Filter
FilterChain.doFilter(request, response);
多个 Filter 依次处理请求。
10. 典型应用场景
- 审批流
- 权限校验
- 过滤器
- 中间件处理
11. 一个常见误区
责任链模式不是为了“把所有逻辑串起来”,而是为了“分离职责”。
参考
更多推荐



所有评论(0)