文章目录
-
- [1. 引言:if-else 审批流的噩梦](#1. 引言:if-else 审批流的噩梦)
- [2. 什么是责任链模式](#2. 什么是责任链模式)
-
- [GoF 定义](#GoF 定义)
- [3. 责任链模式的核心思想](#3. 责任链模式的核心思想)
- [4. 责任链模式的结构](#4. 责任链模式的结构)
- [5. 示例:请假审批流程](#5. 示例:请假审批流程)
-
- [5.1 抽象处理者](#5.1 抽象处理者)
- [5.2 具体处理者](#5.2 具体处理者)
- [5.3 客户端组装责任链](#5.3 客户端组装责任链)
- [6. 责任链模式的优点](#6. 责任链模式的优点)
- [7. 责任链模式的缺点](#7. 责任链模式的缺点)
- [8. 责任链 vs 命令模式](#8. 责任链 vs 命令模式)
- [9. JDK 中的责任链模式](#9. JDK 中的责任链模式)
-
- [Servlet Filter](#Servlet Filter)
- [10. 典型应用场景](#10. 典型应用场景)
- [11. 一个常见误区](#11. 一个常见误区)
- 参考

1. 引言:if-else 审批流的噩梦
在很多业务系统中,你可能写过这样的代码:
java
if (level == 1) {
leader.approve();
} else if (level == 2) {
manager.approve();
} else if (level == 3) {
director.approve();
}
随着规则变化:
- 新增审批人
- 调整审批顺序
- 条件越来越复杂
代码很快就会变成灾难。
责任链模式就是为了解决"请求该交给谁处理"的问题。请求不找人,人来接请求。
2. 什么是责任链模式
GoF 定义
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。
详解:责任链模式,又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
一句话理解:
请求沿着一条链传递,直到有人处理它。
3. 责任链模式的核心思想
责任链模式的关键在于:
- 请求发送者不关心谁处理
- 每个处理者只关心"能不能处理"
- 处理不了就交给下一个
处理逻辑解耦,顺序可配置。
4. 责任链模式的结构
责任链模式通常包含三个角色:
- Handler(抽象处理者)
定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
- ConcreteHandler(具体处理者)
实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
- Client(客户端)
创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
结构示意:
plain
Client → Handler1 → Handler2 → Handler3
5. 示例:请假审批流程
5.1 抽象处理者
java
public abstract class LeaveHandler {
protected LeaveHandler next; // next可继承
public void setNext(LeaveHandler next) {
this.next = next;
}
public abstract void handle(int days);
}
5.2 具体处理者
java
public class LeaderHandler extends LeaveHandler {
@Override
public void handle(int days) {
if (days <= 1) {
System.out.println("组长审批通过");
} else if (next != null) {
next.handle(days);
}
}
}
java
public class ManagerHandler extends LeaveHandler {
@Override
public void handle(int days) {
if (days <= 3) {
System.out.println("经理审批通过");
} else if (next != null) {
next.handle(days);
}
}
}
java
public class DirectorHandler extends LeaveHandler {
@Override
public void handle(int days) {
if (days <= 7) {
System.out.println("总监审批通过");
} else {
System.out.println("请假天数过长,驳回");
}
}
}
5.3 客户端组装责任链
java
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
java
FilterChain.doFilter(request, response);
多个 Filter 依次处理请求。
10. 典型应用场景
- 审批流
- 权限校验
- 过滤器
- 中间件处理
11. 一个常见误区
责任链模式不是为了"把所有逻辑串起来",而是为了"分离职责"。