设计模式之责任链模式:原理解析 + 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
相关推荐
草履虫建模16 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
qq_2975746718 小时前
【实战教程】SpringBoot 实现多文件批量下载并打包为 ZIP 压缩包
java·spring boot·后端
老毛肚18 小时前
MyBatis插件原理及Spring集成
java·spring·mybatis
学嵌入式的小杨同学18 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
lang2015092818 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
Re.不晚19 小时前
Java入门17——异常
java·开发语言
缘空如是19 小时前
基础工具包之JSON 工厂类
java·json·json切换
追逐梦想的张小年19 小时前
JUC编程04
java·idea
好家伙VCC19 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
南极星100520 小时前
蓝桥杯JAVA--启蒙之路(十)class版本 模块
java·开发语言