设计模式之责任链模式:原理解析 + 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
相关推荐
腻害兔4 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
维天说10 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane199410 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
杨充11 小时前
11.DDD与战术建模
设计模式·开源·代码规范
杨充11 小时前
12.综合实战图片框架
设计模式·开源·代码规范
噢,我明白了11 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品11 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库