外观
一句话答案
请求沿链传递,每个处理器决定处理或传给下一个;Spring Filter/Interceptor/AOP Advisor Chain 都是责任链。
核心要点
责任链模式将请求沿着处理者链传递,每个处理者决定是否处理该请求以及是否将其传递给下一个处理者。
核心结构:
java
public abstract class Handler {
protected Handler next; // 指向下一个处理者
public void setNext(Handler next) {
this.next = next;
}
public void handle(Request request) {
if (canHandle(request)) {
doHandle(request);
} else if (next != null) {
next.handle(request); // 传递给下一个
}
}
protected abstract boolean canHandle(Request request);
protected abstract void doHandle(Request request);
}Java/框架中的典型应用:
1. Servlet Filter 链
客户端请求 → Filter1 → Filter2 → Filter3 → Servlet
(编码) (登录) (权限) (业务处理)每个 Filter 通过 chain.doFilter(request, response) 将请求传递给下一个。
2. Spring Security 过滤器链
请求 → SecurityContextPersistenceFilter
→ UsernamePasswordAuthenticationFilter
→ ExceptionTranslationFilter
→ FilterSecurityInterceptor
→ ControllerSpring Security 的整个安全机制就是一条责任链,每个 Filter 负责一项安全检查。
3. Netty ChannelPipeline
入站事件 → Decoder → BusinessHandler → Encoder → 出站事件Netty 的 Pipeline 是一个双向责任链,InboundHandler 处理入站事件,OutboundHandler 处理出站事件。
责任链的优缺点:
- 优点:解耦请求发送者和处理者;动态增减处理节点;每个节点单一职责
- 缺点:请求可能到达链尾仍未被处理;链过长影响性能;调试不方便
四、行为型模式
追问与易错
追问方向:
- 怎么动态添加/删除处理器?
- SS FilterChain 和 Servlet Filter 关系?
- 和装饰器区别?
易错点:
- ❌ 链中每个处理器都必须处理——可以选择传递
- ❌ 责任链性能差——链不长时影响忽略不计
💡 记忆锚点
机场安检流水线:行李过X光机 → 人过安检门 → 证件核验 → 随身物品检查,每关自己决定放行还是拦截,不行就到此为止。Servlet Filter链、Spring Security过滤器链、Netty Pipeline都是这条流水线。