责任链模式是什么?

它属于行为型设计模式。本质是让多个处理器(Handler)排成一条链,请求沿着链传递,直到某个处理器处理为止。发送者不用关心谁来处理,接收者也不用关心谁发的,彻底解耦。

🧩 核心结构

  • 抽象处理器(Handler):定义“处理请求”的方法 + 指向下一个处理器的引用。

  • 具体处理器(ConcreteHandler):决定自己能处理的逻辑,不能处理就甩给下一个。

  • 客户端只负责组装这条链,然后发请求即可。

✅ 为什么用它?

  • 🔓 解耦:请求方与处理方互相透明,加新节点不影响现有代码。

  • 🧷 灵活:链的顺序、节点数量都能动态调整,甚至可以随时熔断。

  • 📦 符合开闭原则:增删处理器无需改动主流程。

⚠️ 明显的坑

  • 🕳️ 可能没人处理:请求传到链尾也没被消费,需要兜底策略。

  • 🐌 性能损耗:长链或复杂判断会导致延迟,尤其在核心路径上要慎重。

  • 🔍 调试困难:链式调用栈会比较深,排查问题不如直连直观。

🎯 真实大厂影子

  • Java Servlet 的 Filter

  • Spring 的 Interceptor 拦截器链

  • Netty 的 ChannelPipeline

  • 审批流、风控告警升级(规则链)

🧠 加分回答(面试官心里给你加鸡腿)

你还可区分“纯”与“不纯”责任链:

  • 纯责任链:一个请求要么被处理,要么扔给下一个,不能同时处理。

  • 不纯(常见):每个节点都能对请求做加工、日志、校验,然后继续传递,比如 Servlet Filter。

最后考你一下:Spring Security 里那串过滤器,就是不纯的责任链,你觉得哪个点最能体现它的灵活性? 👇