【设计模式】责任链模式(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教程 - 廖雪峰的官方网站

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

相关推荐
缓慢更新7 分钟前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
LMT流氓兔2 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
wangbing11253 小时前
平台介绍-modbus设备调试
java
西索斯coding3 小时前
gpt-image-2.5-sunburst 和 gemini-3.1-flash-image 差多少?60 组项目素材的成功成本评测框架
java·linux·gpt·ai
wuminyu4 小时前
Java字节码学习总结:字节码如何加载、解析和执行
java·linux·c语言·jvm·c++
Flynn Liang4 小时前
大模型怎么自己调函数?Spring AI 2.0 Tool Calling 自动循环原理 + 完整时序图
java·人工智能·spring·agent·函数调用·springai·toolcalling
乌暮5 小时前
请求进门先安检:Spring 拦截器与统一功能实战指南
java·开发语言·后端·学习·spring
学长毕设5 小时前
基于SpringBoot的烘焙商品商品系统-附源码
java·spring boot·后端
金銀銅鐵6 小时前
[Java] 用纯 Swing 做一个《論語·學而》阅读器
java·ai编程·交互设计
艾伦_耶格宇7 小时前
【kubernetes - 1.28版本】-11 K8S核心组件
java·容器·kubernetes