文章目录
- 前言
- 一、概念
- 二、核心结构
- [三、Java 代码实现(权限 + 校验 + 日志 责任链)](#三、Java 代码实现(权限 + 校验 + 日志 责任链))
-
- [1. 抽象处理器(定义链条)](#1. 抽象处理器(定义链条))
- [2. 具体处理器1:权限校验](#2. 具体处理器1:权限校验)
- [3. 具体处理器2:参数校验](#3. 具体处理器2:参数校验)
- [4. 具体处理器3:日志记录](#4. 具体处理器3:日志记录)
- [5. 具体处理器4:业务处理](#5. 具体处理器4:业务处理)
- [6. 客户端组装责任链并调用](#6. 客户端组装责任链并调用)
- 四、责任链两种模式
- 五、优缺点
- 六、应用场景(极高频)
- [七、责任链 VS 迭代器 VS 命令](#七、责任链 VS 迭代器 VS 命令)
- 八、总结
前言
开发中经常遇到一个请求需要按顺序经过多个处理者 ,层层过滤、校验、流转:比如权限校验 → 参数校验 → 限流 → 日志 → 业务处理。如果用if-else或硬编码顺序,耦合度极高、扩展极难。责任链模式 就是专门解决多级顺序处理、动态编排、灵活插拔的行为型设计模式。
一、概念
责任链模式(Chain of Responsibility Pattern) 是一种行为型设计模式 ,核心思想:
将请求的发送者与接收者解耦,让多个对象都有机会处理该请求,将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。
简单理解:
- 像流水线一样,一环接一环;
- 每个处理器只关心自己的逻辑;
- 处理完可选择继续传递 或截断;
- 增删处理器不影响其他节点。
一句话:
请求顺着链条走,谁能处理谁处理,不行就往后传。
二、核心结构
- Handler(抽象处理器)
定义统一处理接口,维护下一个处理器next。 - ConcreteHandler(具体处理器)
实现自己的处理逻辑,决定是否继续往下传。 - Client(客户端)
组装链条,发起请求。
三、Java 代码实现(权限 + 校验 + 日志 责任链)
场景:接口请求必须依次经过
- 权限校验
- 参数校验
- 日志记录
- 业务执行
1. 抽象处理器(定义链条)
java
public abstract class Handler {
protected Handler next;
public void setNext(Handler next) {
this.next = next;
}
public abstract void handle(String request);
}
2. 具体处理器1:权限校验
java
public class AuthHandler extends Handler {
@Override
public void handle(String request) {
System.out.println("【权限校验】通过");
if (next != null) {
next.handle(request);
}
}
}
3. 具体处理器2:参数校验
java
public class ParamHandler extends Handler {
@Override
public void handle(String request) {
System.out.println("【参数校验】通过");
if (next != null) {
next.handle(request);
}
}
}
4. 具体处理器3:日志记录
java
public class LogHandler extends Handler {
@Override
public void handle(String request) {
System.out.println("【日志记录】完成");
if (next != null) {
next.handle(request);
}
}
}
5. 具体处理器4:业务处理
java
public class BizHandler extends Handler {
@Override
public void handle(String request) {
System.out.println("【执行业务】请求:" + request);
}
}
6. 客户端组装责任链并调用
java
public class Client {
public static void main(String[] args) {
// 构建链条
Handler auth = new AuthHandler();
Handler param = new ParamHandler();
Handler log = new LogHandler();
Handler biz = new BizHandler();
auth.setNext(param);
param.setNext(log);
log.setNext(biz);
// 发起请求
auth.handle("用户请求:order/create");
}
}
输出:
【权限校验】通过
【参数校验】通过
【日志记录】完成
【执行业务】请求:用户请求:order/create
四、责任链两种模式
-
全传递链 (本文示例)
每个节点都执行,执行完传给下一个。
→ 过滤器、拦截器、日志、审计
-
中断链 (只要一个处理就停止)
一个节点处理后直接返回,不再往后传。
→ 异常处理、审批流、优先级匹配
五、优缺点
优点
- 发送者与接收者完全解耦
- 动态增删、调整顺序,符合开闭原则
- 每个处理器单一职责
- 流程清晰,像流水线一样直观
缺点
- 链过长会性能下降
- 调试麻烦
- 若没设置好
next,容易请求丢失
六、应用场景(极高频)
- 权限拦截
- 参数校验
- 日志、监控、限流、熔断
- 审批流(组长→经理→总监)
- 过滤器、拦截器栈
- 异常捕获链
经典框架:
- Servlet Filter
- Spring Interceptor
- Spring Security 过滤器链
- MyBatis 插件链
- Netty ChannelPipeline
七、责任链 VS 迭代器 VS 命令
- 责任链:请求按顺序流转处理
- 迭代器:遍历集合元素
- 命令:封装行为为对象,可撤销/排队
八、总结
- 责任链模式 = 流水线 + 层层处理
- 核心:请求顺着链走,解耦发送与接收
- 结构:
Handler→next→ 链式调用 - 企业开发最常用行为型模式之一,到处都是它的影子