设计模式之责任链模式:原理解析 + 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)
相关推荐
Mikko72 分钟前
fastjson 1.2.84 能在 JDK 7 上跑吗?实测:编译能过,一启动就 UnsupportedClassVersionError
java·后端·jdk·fastjson·安全漏洞
G018_star sky♬6 分钟前
为什么java新建一个对象,需要obj o = new obj()这种写法
java·开发语言
驭渊的小故事3 小时前
MyBatis XML 开发实战:从配置到 CRUD 全解析
xml·java·mybatis
哦虎!8 小时前
【JavaEE】网络初识
java
for_ever_love__8 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
我是人✓9 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
欣栀♡9 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
IT研究室10 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项10 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog10 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友