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

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

相关推荐
真上帝的左手35 分钟前
10. 软件设计&架构-Spring Security 7 整合CAS SSO 单点登录
java·spring·架构·sso
Zane19941 小时前
单例线程安全、生产者消费者、死锁:并发面试三连问串讲
java·后端
云烟成雨TD2 小时前
Micrometer 系列【42】链路追踪:Span 体系 | 核心 API
java·链路追踪·micrometer
Gorway2 小时前
理解 Spring 依赖注入:从构造器注入到集合与条件 Bean
java·后端
LiLiYuan.2 小时前
【字符串常量池】
java·开发语言·面试
Sylvia33.2 小时前
从轮询到推送:足球数据API架构演进与火星数据技术拆解
java·服务器·网络·python·websocket·架构
cfm_29142 小时前
高并发系统缓存全解
java·缓存
Ghost Face...2 小时前
龙芯Docker全流程:安装到离线迁移实战
java·docker·eureka
16月6日-晴3 小时前
Java面向对象进阶—static
java·开发语言
xiaohaiAIgeo3 小时前
【2026年】ASHRAE 110与EN 14175通风柜测试标准对比:进口与国产品牌性能差距
java·前端·数据库·科普知识