文章目录
- 一、模式概述
- 二、适用场景
- 三、模式结构
- 四、类图(逻辑结构)
- 五、核心实现思路
- [六、Java 示例(审批流程)](#六、Java 示例(审批流程))
- 七、优缺点分析
- [八、Spring 中的责任链](#八、Spring 中的责任链)
一、模式概述
责任链模式 是一种行为型设计模式,它将多个处理者连接成一条链,请求沿着链条传递,直到有一个处理者处理该请求为止。
核心思想:请求发送者与请求处理者解耦
二、适用场景
责任链模式非常适合以下场景:
- 多个对象都可能处理同一个请求
- 处理顺序很重要,但希望灵活配置
- 避免大量 if-else / switch 判断
- 请求的处理者在运行时动态决定
📌 常见应用:
- 审批流(请假、报销)
- Web 过滤器(Servlet Filter)
- 日志系统(按级别处理)
- Spring Security 过滤链
- MQ 消息拦截器
三、模式结构
角色说明
| 角色 | 说明 |
|---|---|
| Handler(抽象处理者) | 定义处理请求的接口,持有下一个处理者 |
| ConcreteHandler(具体处理者) | 实现具体处理逻辑 |
| Client(客户端) | 创建责任链并发起请求 |
四、类图(逻辑结构)
text
Client
|
Handler (抽象)
|
ConcreteHandlerA → ConcreteHandlerB → ConcreteHandlerC
五、核心实现思路
-
每个处理者:
- 判断自己是否能处理
- 能处理 → 处理并结束
- 不能处理 → 交给下一个处理者
-
链的顺序可以:
- 手动指定
- 配置化(Spring 常见)
六、Java 示例(审批流程)
1️⃣ 抽象处理者
java
public abstract class Approver {
protected Approver next;
public void setNext(Approver next) {
this.next = next;
}
public abstract void approve(int amount);
}
2️⃣ 具体处理者
java
public class Manager extends Approver {
@Override
public void approve(int amount) {
if (amount <= 1000) {
System.out.println("经理审批通过:" + amount);
} else if (next != null) {
next.approve(amount);
}
}
}
java
public class Director extends Approver {
@Override
public void approve(int amount) {
if (amount <= 5000) {
System.out.println("总监审批通过:" + amount);
} else if (next != null) {
next.approve(amount);
}
}
}
java
public class CEO extends Approver {
@Override
public void approve(int amount) {
if (amount <= 20000) {
System.out.println("CEO审批通过:" + amount);
} else {
System.out.println("金额过大,拒绝审批:" + amount);
}
}
}
3️⃣ 客户端组装责任链
java
public class Client {
public static void main(String[] args) {
Approver manager = new Manager();
Approver director = new Director();
Approver ceo = new CEO();
manager.setNext(director);
director.setNext(ceo);
manager.approve(800);
manager.approve(3000);
manager.approve(10000);
}
}
4️⃣ 运行结果
text
经理审批通过:800
总监审批通过:3000
CEO审批通过:10000

七、优缺点分析
优点
- 解耦请求发送者与处理者
- 符合开闭原则
- 责任分离,代码清晰
- 易于扩展处理节点
缺点
- 请求可能无人处理
- 链过长可能影响性能
- 调试不如直观(流程不明显)
八、Spring 中的责任链
Spring 中的典型应用:
FilterChainHandlerInterceptorOncePerRequestFilter- Spring Security Filter Chain
📌 Spring 实际是"责任链 + 模板方法"组合
-
处理者尽量职责单一
-
避免在链中写复杂业务
-
可配合:
- 枚举
- 注解
- Spring 自动装配排序(
@Order)