职责链模式通过抽象处理者定义统一入口和转发逻辑,具体处理者按职责范围判断是否处理请求并决定是否传递,客户端组装链并发起请求,支持动态插拔与兜底处理。

职责链模式(Chain of Responsibility)在 Java 面向对象编程中,核心是让多个对象都有机会处理同一请求,避免请求发送者与接收者耦合,把处理逻辑串联成一条链,每个节点决定是否处理或转交给下一个节点。
定义抽象处理者(Handler)
创建一个抽象类或接口,声明处理方法(如 handleRequest())和设置下一节点的引用(setNext())。这是职责链的统一入口和连接基础。
- 推荐用抽象类,方便提供默认转发逻辑(比如调用 next.handleRequest())
- 处理方法通常返回 boolean 或 void:返回 boolean 可表示“是否已处理完毕”,便于中断链;void 则默认继续传递
- 注意 next 引用类型应为同一抽象类型,保证链可无限延伸
实现具体处理者(ConcreteHandler)
每个具体类继承/实现抽象处理者,覆盖处理逻辑。关键在于:只处理自己职责范围内的请求,不匹配就交给 next。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在 handleRequest() 中先判断当前对象能否处理(例如根据请求类型、数值范围、权限等级等)
- 能处理则执行业务逻辑并返回(或结束),不能处理则检查 next != null 后调用 next.handleRequest()
- 避免空指针:建议在抽象基类中封装安全转发逻辑,子类只需专注条件判断
构建和使用职责链
客户端负责组装链(按优先级或流程顺序),然后只向链头发起请求,后续流转由各节点自动完成。
- 链的顺序很重要:比如审批流中,“组长 → 部门经理 → CEO”,需按权限从小到大设置 next
- 可用构造器或 setter 设置下一节点,也可用 Fluent API(如 handler1.setNext(handler2).setNext(handler3))提升可读性
- 可加入“终结者”节点(如 DefaultHandler),确保请求总被兜底处理,防止链断裂后无响应
增强实用性的小技巧
纯职责链容易变成“if-else 拆散版”,加点设计能让它更健壮、易维护。
- 请求对象建议封装成独立类(如 ApprovalRequest),包含 type、amount、user 等字段,方便各 Handler 统一判断
- 支持动态插拔:用 List
存储所有处理器,运行时 add/remove,适合规则频繁变化的场景 - 避免循环引用:构建链时做简单校验(如检测 next 是否指向自身或已存在的上游节点)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










