设计模式之责任链模式:原理解析 + 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
相关推荐
Java小生不才17 分钟前
Spring AI文生音
java·人工智能·spring
凯尔萨厮21 分钟前
Springboot2.x+Thymeleaf项目创建
java
fish_xk33 分钟前
map和set
java·开发语言
李崧正1 小时前
Java技术分享:Lambda表达式与函数式编程
java·开发语言·python
老了,不知天命1 小时前
鳶尾花項目JAVA
java·开发语言·机器学习
二哈赛车手1 小时前
新人笔记---实现简易版的rag的bm25检索(利用ES),以及RAG上传时的ES与向量数据库双写
java·数据库·笔记·spring·elasticsearch·ai
winner88811 小时前
从零吃透C++命名空间、std、#include、string、vector
java·开发语言·c++
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】第26题:Java的抽象类和接口有哪些区别
java·开发语言·面试
bzmK1DTbd1 小时前
SOLID原则在Java中的实践:单一职责与开闭原则
java·开发语言·开闭原则
winner88811 小时前
C++ 命名空间、虚函数、抽象类、protected 权限全套通俗易懂精讲(附与 Java 对比)
java·开发语言·c++