【设计模式】责任链模式(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 分钟前
《ShardingSphere解读》16 改写引擎:如何理解装饰器模式下的 SQL 改写实现机制?
java·数据库·后端·sql·shardingsphere·分库分表·装饰器模式
q54314708712 分钟前
VScode 开发 Springboot 程序
java·spring boot·后端
han_13 分钟前
JavaScript设计模式(二):策略模式实现与应用
前端·javascript·设计模式
小涛不学习21 分钟前
Java高频面试题(带答案版)
java·开发语言
big_rabbit050221 分钟前
JVM堆内存查看命令
java·linux·算法
学习要积极30 分钟前
Springboot图片验证码-EasyCaptcha
java·spring boot·后端
李少兄40 分钟前
企业资源计划(ERP)系统全景指南
java·前端·数据库·erp
波波七43 分钟前
SSM与Springboot是什么关系? -----区别与联系
java·spring boot·后端
myloveasuka1 小时前
[Java]单列集合
android·java·开发语言
ok_hahaha1 小时前
java从头开始-黑马点评-基础篇
java·开发语言