【设计模式】责任链模式(Chain of Responsibility)详解

文章目录

    • [1. 引言:if-else 审批流的噩梦](#1. 引言:if-else 审批流的噩梦)
    • [2. 什么是责任链模式](#2. 什么是责任链模式)
      • [GoF 定义](#GoF 定义)
    • [3. 责任链模式的核心思想](#3. 责任链模式的核心思想)
    • [4. 责任链模式的结构](#4. 责任链模式的结构)
    • [5. 示例:请假审批流程](#5. 示例:请假审批流程)
      • [5.1 抽象处理者](#5.1 抽象处理者)
      • [5.2 具体处理者](#5.2 具体处理者)
      • [5.3 客户端组装责任链](#5.3 客户端组装责任链)
    • [6. 责任链模式的优点](#6. 责任链模式的优点)
    • [7. 责任链模式的缺点](#7. 责任链模式的缺点)
    • [8. 责任链 vs 命令模式](#8. 责任链 vs 命令模式)
    • [9. JDK 中的责任链模式](#9. JDK 中的责任链模式)
      • [Servlet Filter](#Servlet Filter)
    • [10. 典型应用场景](#10. 典型应用场景)
    • [11. 一个常见误区](#11. 一个常见误区)
    • 参考

1. 引言:if-else 审批流的噩梦

在很多业务系统中,你可能写过这样的代码:

java 复制代码
if (level == 1) {
    leader.approve();
} else if (level == 2) {
    manager.approve();
} else if (level == 3) {
    director.approve();
}

随着规则变化:

  • 新增审批人
  • 调整审批顺序
  • 条件越来越复杂

代码很快就会变成灾难。

责任链模式就是为了解决"请求该交给谁处理"的问题。请求不找人,人来接请求。


2. 什么是责任链模式

GoF 定义

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。

详解:责任链模式,又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

一句话理解:

请求沿着一条链传递,直到有人处理它。


3. 责任链模式的核心思想

责任链模式的关键在于:

  • 请求发送者不关心谁处理
  • 每个处理者只关心"能不能处理"
  • 处理不了就交给下一个

处理逻辑解耦,顺序可配置。


4. 责任链模式的结构

责任链模式通常包含三个角色:

  1. Handler(抽象处理者)

定义一个处理请求的接口,包含抽象处理方法和一个后继连接。

  1. ConcreteHandler(具体处理者)

实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。

  1. Client(客户端)

创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

结构示意:

plain 复制代码
Client → Handler1 → Handler2 → Handler3

5. 示例:请假审批流程

5.1 抽象处理者

java 复制代码
public abstract class LeaveHandler {

    protected LeaveHandler next;  // next可继承

    public void setNext(LeaveHandler next) {
        this.next = next;
    }

    public abstract void handle(int days);
}

5.2 具体处理者

java 复制代码
public class LeaderHandler extends LeaveHandler {

    @Override
    public void handle(int days) {
        if (days <= 1) {
            System.out.println("组长审批通过");
        } else if (next != null) {
            next.handle(days);
        }
    }
}
java 复制代码
public class ManagerHandler extends LeaveHandler {

    @Override
    public void handle(int days) {
        if (days <= 3) {
            System.out.println("经理审批通过");
        } else if (next != null) {
            next.handle(days);
        }
    }
}
java 复制代码
public class DirectorHandler extends LeaveHandler {

    @Override
    public void handle(int days) {
        if (days <= 7) {
            System.out.println("总监审批通过");
        } else {
            System.out.println("请假天数过长,驳回");
        }
    }
}

5.3 客户端组装责任链

java 复制代码
LeaveHandler leader = new LeaderHandler();
LeaveHandler manager = new ManagerHandler();
LeaveHandler director = new DirectorHandler();

leader.setNext(manager);
manager.setNext(director);

leader.handle(5);

6. 责任链模式的优点

  1. 请求与处理者解耦
  2. 易于扩展新节点
  3. 顺序灵活可配置
  4. 符合开闭原则

7. 责任链模式的缺点

  1. 请求可能无人处理
  2. 调试不直观
  3. 链条过长影响性能

8. 责任链 vs 命令模式

维度 责任链模式 命令模式
核心 处理者链 请求对象
是否有多个接收者
是否强调顺序

9. JDK 中的责任链模式

Servlet Filter

java 复制代码
FilterChain.doFilter(request, response);

多个 Filter 依次处理请求。


10. 典型应用场景

  • 审批流
  • 权限校验
  • 过滤器
  • 中间件处理

11. 一个常见误区

责任链模式不是为了"把所有逻辑串起来",而是为了"分离职责"。


参考

责任链模式 | 菜鸟教程

《图解设计模式》

责任链 - Java教程 - 廖雪峰的官方网站

责任链设计模式(职责链模式)

相关推荐
AC赳赳老秦1 分钟前
司法公开数据采集应用:OpenClaw 抓取裁判文书公开信息,批量整理同类参考案例
java·大数据·python·数据挖掘·数据分析·php·openclaw
笑小枫8 分钟前
用 Claude Code 推翻重写笑小枫网站
java·人工智能·spring boot·ai编程
富贵冼中求20 分钟前
从单向流到双向 RPC:Agent 通信协议的范式分叉与 ACP 协议实战拆解
设计模式·架构
霸道流氓气质21 分钟前
ApiPost 中配置自动获取 Token 并调用业务接口完整指南
java·服务器·数据库
独隅41 分钟前
IntelliJ IDEA 接入多种AI大模型插件终极指南(2026.1 企业合规版)
java·人工智能·intellij-idea
还是奇怪1 小时前
Simon Willison 用 DSPy 优化 Datasette Agent 提示词:提示工程正在变成可测试的软件工程
java·开发语言·软件工程
zfoo-framework1 小时前
1.ansible安装 2.虚拟机克隆
java
码上解惑2 小时前
从 Dify 工作流说起:常用节点怎么选、怎样组合?
java·人工智能·ai·agent·dify·智能体·spring ai
青山木3 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
程序员-珍3 小时前
报错下载android sdk失败
android·java