报销 800 元,组长就能批。报销 3000 元,得找经理。金额再高,还要继续往上走。
责任链模式很适合这种场景:发起人只提交请求,链条自己找处理人。

全写在 if-else 里,会越来越长
审批人一多,金额判断容易全挤在一段代码里。
以后再加总监,原来的判断还得修改。责任链把每一级审批单独拆开。
先看关键 UML 图
Approver 保存一个 next,指向下一级审批人。组长、经理和老板分别继承它。
审批人先处理自己的额度
public abstract class Approver {
private final String name;
private final int limit;
private Approver next;
protected Approver(String name, int limit) {
this.name = name;
this.limit = limit;
}
}
组长额度 1000 元,经理 5000 元,老板 20000 元。
处理不了就交给下一级
public void approve(int amount) {
if (amount <= limit) {
System.out.println(name + "批准了 " + amount + " 元");
} else if (next != null) {
System.out.println(name + "无权处理,交给下一级");
next.approve(amount);
} else {
System.out.println("金额 " + amount + " 元,无人能够批准");
}
}
3000 元先到组长手里,额度不够,交给经理。经理能批,链条就在这里停下。
把审批人连起来
Approver lead = new TeamLead();
lead.setNext(new Manager()).setNext(new Boss());
发起人只要把报销交给 lead,不需要逐个认识经理和老板。
lead.approve(800);
lead.approve(3000);
lead.approve(12000);
输出会分别由组长、经理、老板批准。济南话说,该谁办就传到谁那儿。
链尾没人能处理怎么办
30000 元超过老板额度,而且后面没有审批人了。
代码要明确返回失败或抛出合适异常。别让请求悄悄没了,排查起来怪难受。
链条顺序很重要
一般把额度小的审批人放前面,能早点处理就早点结束。
如果顺序接错,老板放在最前面,很多小额报销也会被老板直接处理。代码能跑,业务却不对。
啥时候适合用责任链
审批、过滤器、校验流程等场景,都能看到责任链的思路。
处理人很少、流程不会变化时,普通调用更直白。链条太长也会增加排查难度。
狗哥收个尾
责任链模式的重点,是 让请求沿着处理者链条传递。
每个处理者只关心自己能不能处理。能处理就结束,不能处理就交给 next。
下一篇继续聊 命令模式,看看遥控器按钮怎么和具体操作分开。