下面从零开始、用标准设计模式的方式给你介绍责任链(Chain of Responsibility)。
⸻
一、什么是责任链设计模式?
责任链模式是一种行为型设计模式,它的核心思想是:
将一个请求沿着一条“处理者链”传递,链上的每个处理者都可以决定是否处理这个请求,或者把它交给下一个处理者。
请求的发起者不需要知道:
• 谁会处理它
• 处理流程的顺序
• 会不会被多个对象处理
它只需要把请求交给“链”。
⸻
二、为什么要有责任链?
假设你要处理一个“请假申请”:
规则可能是:
• 1 天以内,组长审批
• 3 天以内,经理审批
• 超过 3 天,老板审批
如果不用责任链,你会写:
if (days <= 1) leader.approve();
else if (days <= 3) manager.approve();
else boss.approve();
问题是:
• 规则写死在代码里
• 新增规则要改 if else
• 审批顺序难以扩展
责任链的做法是:
Leader → Manager → Boss
请假单从 Leader 传到 Manager,再传到 Boss,
谁能处理谁就处理。
⸻
三、责任链的标准结构
经典 UML 结构是:
Client → Handler → Handler → Handler
在代码中通常是:
1. 抽象处理者
public abstract class Handler {
protected Handler next;
public void setNext(Handler next) {
this.next = next;
}
public abstract void handle(Request request);
}
2. 具体处理者
public class Leader extends Handler {
public void handle(Request request) {
if (request.days <= 1) {
System.out.println("Leader approved");
} else if (next != null) {
next.handle(request);
}
}
}
public class Manager extends Handler {
public void handle(Request request) {
if (request.days <= 3) {
System.out.println("Manager approved");
} else if (next != null) {
next.handle(request);
}
}
}
public class Boss extends Handler {
public void handle(Request request) {
System.out.println("Boss approved");
}
}
3. 客户端
Leader leader = new Leader();
Manager manager = new Manager();
Boss boss = new Boss();
leader.setNext(manager);
manager.setNext(boss);
leader.handle(new Request(5));
⸻
四、这个模式解决了什么问题?
它解决的是:
“请求发送者”和“请求处理者”之间的强耦合
客户端不再关心:
• 是谁处理
• 怎么处理
• 处理顺序
这些都由“链”决定。
⸻
五、责任链的优点
1. 符合开闭原则
新增一个处理者,只需要插入到链中。
2. 解耦调用方和处理方
客户端不用写 if/else。
3. 流程可组合
同一个请求可以被多个处理者加工。
⸻
六、责任链的缺点
1. 请求可能没人处理
如果链末尾没有兜底逻辑,请求可能“消失”。
2. 调试困难
调用路径不是显式代码,而是运行时拼出来的。
3. 性能略有损耗
请求要经过多个对象。
⸻
七、现实世界中的例子
责任链非常常见:
• 公司审批流程
• Web 服务器的过滤器(Filter)
• 中间件的拦截器
• 日志 → 校验 → 业务处理流程
它的本质就是:
“把流程拆成多个可插拔的节点,让请求依次通过。”
⸻
八、一句话总结
责任链设计模式 = 用一条可配置的处理链,来代替写死在代码里的 if-else 调度逻辑。
如果你需要构建“可扩展的流程”,它几乎是最重要的设计模式之一。