责任链模式是什么?
它属于行为型设计模式。本质是让多个处理器(Handler)排成一条链,请求沿着链传递,直到某个处理器处理为止。发送者不用关心谁来处理,接收者也不用关心谁发的,彻底解耦。
🧩 核心结构
-
抽象处理器(Handler):定义“处理请求”的方法 + 指向下一个处理器的引用。
-
具体处理器(ConcreteHandler):决定自己能处理的逻辑,不能处理就甩给下一个。
-
客户端只负责组装这条链,然后发请求即可。
✅ 为什么用它?
-
🔓 解耦:请求方与处理方互相透明,加新节点不影响现有代码。
-
🧷 灵活:链的顺序、节点数量都能动态调整,甚至可以随时熔断。
-
📦 符合开闭原则:增删处理器无需改动主流程。
⚠️ 明显的坑
-
🕳️ 可能没人处理:请求传到链尾也没被消费,需要兜底策略。
-
🐌 性能损耗:长链或复杂判断会导致延迟,尤其在核心路径上要慎重。
-
🔍 调试困难:链式调用栈会比较深,排查问题不如直连直观。
🎯 真实大厂影子
-
Java Servlet 的
Filter链 -
Spring 的
Interceptor拦截器链 -
Netty 的
ChannelPipeline -
审批流、风控告警升级(规则链)
🧠 加分回答(面试官心里给你加鸡腿)
你还可区分“纯”与“不纯”责任链:
-
纯责任链:一个请求要么被处理,要么扔给下一个,不能同时处理。
-
不纯(常见):每个节点都能对请求做加工、日志、校验,然后继续传递,比如 Servlet Filter。
最后考你一下:Spring Security 里那串过滤器,就是不纯的责任链,你觉得哪个点最能体现它的灵活性? 👇