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

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

相关推荐
智慧物业老杨1 小时前
物业日常巡查的数智化重构:从“打卡式巡检“到“闭环式风控“
android·java·人工智能·系统架构·rxjava
步行cgn8 小时前
Spring c 命名空间注入详解
java·后端·spring
明月_清风8 小时前
Maven 到底是什么?一篇文章搞懂 Java 项目构建与依赖管理
java·后端·maven
aramae9 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
Rain的Java大神之路9 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
Wang's Blog10 小时前
Java 接入Redis: 通用命令与键管理
java·服务器·redis
Wang's Blog10 小时前
Java 接入Redis: 列表集合与有序集合操作命令
java·服务器·redis
Ivanqhz10 小时前
SVD++算法
java·服务器·网络·深度学习·神经网络
qq_25183645711 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
caoerzhong11 小时前
JeeWMS 开源仓库管理系统全景解读:一套 Java WMS 如何把 WMS/OMS/BMS/TMS 装进同一个系统
java·开源