责任链设计模式

下面从零开始、用标准设计模式的方式给你介绍责任链(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 调度逻辑。

如果你需要构建“可扩展的流程”,它几乎是最重要的设计模式之一。