设计模式之责任链模式:原理解析 + Java 示例

文章目录

一、模式概述

责任链模式 是一种行为型设计模式,它将多个处理者连接成一条链,请求沿着链条传递,直到有一个处理者处理该请求为止。

核心思想:请求发送者与请求处理者解耦


二、适用场景

责任链模式非常适合以下场景:

  1. 多个对象都可能处理同一个请求
  2. 处理顺序很重要,但希望灵活配置
  3. 避免大量 if-else / switch 判断
  4. 请求的处理者在运行时动态决定

📌 常见应用:

  • 审批流(请假、报销)
  • Web 过滤器(Servlet Filter)
  • 日志系统(按级别处理)
  • Spring Security 过滤链
  • MQ 消息拦截器

三、模式结构

角色说明

角色 说明
Handler(抽象处理者) 定义处理请求的接口,持有下一个处理者
ConcreteHandler(具体处理者) 实现具体处理逻辑
Client(客户端) 创建责任链并发起请求

四、类图(逻辑结构)

text 复制代码
Client
  |
Handler (抽象)
  |
ConcreteHandlerA → ConcreteHandlerB → ConcreteHandlerC

五、核心实现思路

  1. 每个处理者:

    • 判断自己是否能处理
    • 能处理 → 处理并结束
    • 不能处理 → 交给下一个处理者
  2. 链的顺序可以:

    • 手动指定
    • 配置化(Spring 常见)

六、Java 示例(审批流程)

1️⃣ 抽象处理者

java 复制代码
public abstract class Approver {

    protected Approver next;

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

    public abstract void approve(int amount);
}

2️⃣ 具体处理者

java 复制代码
public class Manager extends Approver {

    @Override
    public void approve(int amount) {
        if (amount <= 1000) {
            System.out.println("经理审批通过:" + amount);
        } else if (next != null) {
            next.approve(amount);
        }
    }
}
java 复制代码
public class Director extends Approver {

    @Override
    public void approve(int amount) {
        if (amount <= 5000) {
            System.out.println("总监审批通过:" + amount);
        } else if (next != null) {
            next.approve(amount);
        }
    }
}
java 复制代码
public class CEO extends Approver {

    @Override
    public void approve(int amount) {
        if (amount <= 20000) {
            System.out.println("CEO审批通过:" + amount);
        } else {
            System.out.println("金额过大,拒绝审批:" + amount);
        }
    }
}

3️⃣ 客户端组装责任链

java 复制代码
public class Client {
    public static void main(String[] args) {

        Approver manager = new Manager();
        Approver director = new Director();
        Approver ceo = new CEO();

        manager.setNext(director);
        director.setNext(ceo);

        manager.approve(800);
        manager.approve(3000);
        manager.approve(10000);
    }
}

4️⃣ 运行结果

text 复制代码
经理审批通过:800
总监审批通过:3000
CEO审批通过:10000

七、优缺点分析

优点

  • 解耦请求发送者与处理者
  • 符合开闭原则
  • 责任分离,代码清晰
  • 易于扩展处理节点

缺点

  • 请求可能无人处理
  • 链过长可能影响性能
  • 调试不如直观(流程不明显)

八、Spring 中的责任链

Spring 中的典型应用:

  • FilterChain
  • HandlerInterceptor
  • OncePerRequestFilter
  • Spring Security Filter Chain

📌 Spring 实际是"责任链 + 模板方法"组合


  • 处理者尽量职责单一

  • 避免在链中写复杂业务

  • 可配合:

    • 枚举
    • 注解
    • Spring 自动装配排序(@Order
相关推荐
云烟成雨TD1 天前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
于慨1 天前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
swg3213211 天前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
gelald1 天前
SpringBoot - 自动配置原理
java·spring boot·后端
殷紫川1 天前
深入理解 AQS:从架构到实现,解锁 Java 并发编程的核心密钥
java
一轮弯弯的明月1 天前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
chenjingming6661 天前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
殷紫川1 天前
深入拆解 Java volatile:从内存屏障到无锁编程的实战指南
java
eddieHoo1 天前
查看 Tomcat 的堆内存参数
java·tomcat
那个失眠的夜1 天前
Mybatis延迟加载策略
xml·java·数据库·maven·mybatis