责任链模式详尽总结¶
一、定义与核心思想¶
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过构建请求处理对象的链式结构,使得请求发送者无需知道具体的接收者,多个对象有机会按顺序处理请求,从而实现请求发起者与处理者之间的解耦。
本质上,责任链模式通过将请求的判断逻辑内聚于每个处理节点内部,将行为的控制权从客户端下放到各个职责处理单元,从而实现模块间的结构解耦与行为协作。
二、结构角色¶
- Handler(抽象处理者):定义处理请求的接口,并持有下一个处理者的引用
- ConcreteHandler(具体处理者):实现处理逻辑,并决定是否处理或传递
- Client(客户端):构造链条并发起请求
abstract class Handler {
protected Handler next;
public void setNext(Handler next) { this.next = next; }
public abstract void handleRequest(String request);
}
三、责任链的本质优点¶
1. 判断逻辑内聚,客户端解耦¶
本质:判断逻辑从集中式(Client)迁移到分布式(Handler),客户端无需了解具体处理者。
示例:
class Manager extends Handler {
public void handleRequest(String request) {
if (request.equals("小额报销")) {
System.out.println("Manager 处理");
} else if (next != null) {
next.handleRequest(request);
}
}
}
Client 只需启动链:
manager.setNext(director);
manager.handleRequest("小额报销");
2. 遵循开闭原则,方便扩展¶
本质:新增处理者仅需新增类与链配置,不影响其他代码。
示例:
class VicePresident extends Handler { ... }
// 插入链中
manager.setNext(vp);
vp.setNext(director);
3. 支持运行时动态构造¶
本质:链条可以根据配置、数据库、插件等动态组合。
示例:
List<String> names = configService.getHandlers();
Handler head = null;
for (String name : names) {
Handler h = HandlerFactory.create(name);
if (head == null) head = h;
else last.setNext(h);
last = h;
}
4. 行为路径可控,支持终止或继续¶
本质:每个节点可选择是否处理、是否继续传递。
示例:
class AuditLogger extends Handler {
public void handleRequest(String request) {
log(request);
if (next != null) next.handleRequest(request);
}
}
5. 职责单一、便于测试与复用¶
本质:每个处理器只关注自己的处理逻辑,易于复用与单元测试。
示例:
DirectorHandler
可在多个链中复用:
审批链1:Manager → Director
审批链2:Supervisor → Director
6. 适用于责任不确定或需多方处理的场景¶
本质:当处理者在运行期才能确定,或可能存在多个候选时,责任链可灵活处理。
示例:浏览器事件冒泡:
点击事件传递路径:div → body → document → window
四、UML结构图(文本形式)¶
Client
|
v
Handler (抽象类)
|-- Manager (具体处理者)
|-- Director (具体处理者)
|-- ...
每个 Handler 持有 next 指针形成链
五、小结¶
本质优点 | 描述 |
---|---|
判断内聚 | 每个节点自行判断是否处理,无需客户端判断 |
结构解耦 | 客户端仅依赖抽象接口,不依赖具体处理者 |
易扩展 | 添加处理节点无需修改其他处理者或客户端代码 |
可配置 | 责任链结构可运行时按需构建 |
控制灵活 | 可中断、可继续,灵活组合处理逻辑 |
易测试复用 | 每个处理器逻辑单一,易单元测试、易迁移复用 |
责任链模式不仅适用于审批、日志、权限等经典场景,也适用于任何职责可分解、处理流程可串联的复杂系统逻辑。