JavaDog程序狗
发布于 2026-11-13 / 1 阅读
0
0

【设计模式】跟着狗哥复习设计模式(十三):责任链模式

报销 800 元,组长就能批。报销 3000 元,得找经理。金额再高,还要继续往上走。

责任链模式很适合这种场景:发起人只提交请求,链条自己找处理人。

加瓦狗提交报销单并逐级审批

全写在 if-else 里,会越来越长

审批人一多,金额判断容易全挤在一段代码里。

报销审批规则堆在if-else中

以后再加总监,原来的判断还得修改。责任链把每一级审批单独拆开。

先看关键 UML 图

责任链模式关键 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元报销在责任链中的传递过程

3000 元先到组长手里,额度不够,交给经理。经理能批,链条就在这里停下。

把审批人连起来

Approver lead = new TeamLead();
lead.setNext(new Manager()).setNext(new Boss());

组长经理老板通过next组成审批链

发起人只要把报销交给 lead,不需要逐个认识经理和老板。

lead.approve(800);
lead.approve(3000);
lead.approve(12000);

输出会分别由组长、经理、老板批准。济南话说,该谁办就传到谁那儿。

链尾没人能处理怎么办

30000 元超过老板额度,而且后面没有审批人了。

责任链末尾无人处理请求

代码要明确返回失败或抛出合适异常。别让请求悄悄没了,排查起来怪难受。

链条顺序很重要

一般把额度小的审批人放前面,能早点处理就早点结束。

如果顺序接错,老板放在最前面,很多小额报销也会被老板直接处理。代码能跑,业务却不对。

啥时候适合用责任链

什么时候适合使用责任链模式

审批、过滤器、校验流程等场景,都能看到责任链的思路。

处理人很少、流程不会变化时,普通调用更直白。链条太长也会增加排查难度。

狗哥收个尾

责任链模式的重点,是 让请求沿着处理者链条传递。

每个处理者只关心自己能不能处理。能处理就结束,不能处理就交给 next。

下一篇继续聊 命令模式,看看遥控器按钮怎么和具体操作分开。


评论