责任链模式通过抽象handler接口和运行时注入nexthandler实现解耦,发送者只依赖接口不依赖具体实现,链由外部组装,支持动态扩展与空处理。

责任链模式通过引入“中间传递层”,让请求发送者完全不依赖具体哪个对象来处理请求,只面向一个统一的处理接口发起调用。解耦的关键不在去掉接收者,而在于切断发送者对接收者身份、数量、顺序和存在性的任何认知。
让发送者只认 Handler 接口,不认具体实现类
定义一个抽象 Handler 类或接口,声明 handle(request) 方法,并可选地持有 nextHandler 引用。所有具体处理器(如 AuthHandler、RateLimitHandler、LogHandler)都实现该接口。客户端代码只与 Handler 类型交互,编译期就与具体处理逻辑脱钩。
链的组装交给客户端或配置,不写死在处理器内部
每个 ConcreteHandler 不负责决定“下一个是谁”,只负责判断“我是否处理”和“是否往下传”。链的拼接由外部完成,例如:
- 手动串联:
authHandler.setNext(rateLimitHandler).setNext(logHandler) - Spring 中用 @Order 或 BeanFactory 构建有序 Bean 链
- 用 List
+ for 循环模拟链式调用
请求传递不靠继承或强类型跳转,靠接口方法调用
当一个处理器不处理当前请求时,它不做 new NextHandler().handle() 这种硬编码调用,而是调用 nextHandler.handle(request) —— 这个 nextHandler 是运行时注入的,类型就是 Handler 接口。这样即使后续替换成 MockHandler 或新增 AuditHandler,发送者和当前处理器都不需要改代码。
支持空处理与终止条件,避免隐式依赖
链末尾的处理器可以是 null 或一个默认的 DefaultHandler,显式处理“无人接手”的情况。这防止了因漏配 next 导致 NPE,也意味着发送者无需假设链一定有终点——它只管发,链自己决定停在哪。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











