跳转至

责任链模式详尽总结

一、定义与核心思想

责任链模式(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 可在多个链中复用:

审批链1Manager  Director
审批链2Supervisor  Director

6. 适用于责任不确定或需多方处理的场景

本质:当处理者在运行期才能确定,或可能存在多个候选时,责任链可灵活处理。

示例:浏览器事件冒泡:

点击事件传递路径:div → body → document → window


四、UML结构图(文本形式)

Client
  |
  v
Handler (抽象类)
  |-- Manager (具体处理者)
  |-- Director (具体处理者)
  |-- ...
每个 Handler 持有 next 指针形成链

五、小结

本质优点 描述
判断内聚 每个节点自行判断是否处理,无需客户端判断
结构解耦 客户端仅依赖抽象接口,不依赖具体处理者
易扩展 添加处理节点无需修改其他处理者或客户端代码
可配置 责任链结构可运行时按需构建
控制灵活 可中断、可继续,灵活组合处理逻辑
易测试复用 每个处理器逻辑单一,易单元测试、易迁移复用

责任链模式不仅适用于审批、日志、权限等经典场景,也适用于任何职责可分解、处理流程可串联的复杂系统逻辑。

回到页面顶部