【设计模式】行为型-责任链模式

文章目录

  • 前言
  • 一、概念
  • 二、核心结构
  • [三、Java 代码实现(权限 + 校验 + 日志 责任链)](#三、Java 代码实现(权限 + 校验 + 日志 责任链))
    • [1. 抽象处理器(定义链条)](#1. 抽象处理器(定义链条))
    • [2. 具体处理器1:权限校验](#2. 具体处理器1:权限校验)
    • [3. 具体处理器2:参数校验](#3. 具体处理器2:参数校验)
    • [4. 具体处理器3:日志记录](#4. 具体处理器3:日志记录)
    • [5. 具体处理器4:业务处理](#5. 具体处理器4:业务处理)
    • [6. 客户端组装责任链并调用](#6. 客户端组装责任链并调用)
  • 四、责任链两种模式
  • 五、优缺点
  • 六、应用场景(极高频)
  • [七、责任链 VS 迭代器 VS 命令](#七、责任链 VS 迭代器 VS 命令)
  • 八、总结

前言

开发中经常遇到一个请求需要按顺序经过多个处理者 ,层层过滤、校验、流转:比如权限校验 → 参数校验 → 限流 → 日志 → 业务处理。如果用if-else或硬编码顺序,耦合度极高、扩展极难。责任链模式 就是专门解决多级顺序处理、动态编排、灵活插拔的行为型设计模式。


一、概念

责任链模式(Chain of Responsibility Pattern) 是一种行为型设计模式 ,核心思想:
将请求的发送者与接收者解耦,让多个对象都有机会处理该请求,将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。

简单理解:

  • 流水线一样,一环接一环;
  • 每个处理器只关心自己的逻辑;
  • 处理完可选择继续传递截断
  • 增删处理器不影响其他节点

一句话:
请求顺着链条走,谁能处理谁处理,不行就往后传。


二、核心结构

  1. Handler(抽象处理器)
    定义统一处理接口,维护下一个处理器next
  2. ConcreteHandler(具体处理器)
    实现自己的处理逻辑,决定是否继续往下传。
  3. Client(客户端)
    组装链条,发起请求。

三、Java 代码实现(权限 + 校验 + 日志 责任链)

场景:接口请求必须依次经过

  1. 权限校验
  2. 参数校验
  3. 日志记录
  4. 业务执行

1. 抽象处理器(定义链条)

java 复制代码
public abstract class Handler {
    protected Handler next;

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

    public abstract void handle(String request);
}

2. 具体处理器1:权限校验

java 复制代码
public class AuthHandler extends Handler {
    @Override
    public void handle(String request) {
        System.out.println("【权限校验】通过");
        if (next != null) {
            next.handle(request);
        }
    }
}

3. 具体处理器2:参数校验

java 复制代码
public class ParamHandler extends Handler {
    @Override
    public void handle(String request) {
        System.out.println("【参数校验】通过");
        if (next != null) {
            next.handle(request);
        }
    }
}

4. 具体处理器3:日志记录

java 复制代码
public class LogHandler extends Handler {
    @Override
    public void handle(String request) {
        System.out.println("【日志记录】完成");
        if (next != null) {
            next.handle(request);
        }
    }
}

5. 具体处理器4:业务处理

java 复制代码
public class BizHandler extends Handler {
    @Override
    public void handle(String request) {
        System.out.println("【执行业务】请求:" + request);
    }
}

6. 客户端组装责任链并调用

java 复制代码
public class Client {
    public static void main(String[] args) {
        // 构建链条
        Handler auth = new AuthHandler();
        Handler param = new ParamHandler();
        Handler log = new LogHandler();
        Handler biz = new BizHandler();

        auth.setNext(param);
        param.setNext(log);
        log.setNext(biz);

        // 发起请求
        auth.handle("用户请求:order/create");
    }
}

输出:

复制代码
【权限校验】通过
【参数校验】通过
【日志记录】完成
【执行业务】请求:用户请求:order/create

四、责任链两种模式

  1. 全传递链 (本文示例)

    每个节点都执行,执行完传给下一个。

    → 过滤器、拦截器、日志、审计

  2. 中断链 (只要一个处理就停止)

    一个节点处理后直接返回,不再往后传。

    → 异常处理、审批流、优先级匹配


五、优缺点

优点

  • 发送者与接收者完全解耦
  • 动态增删、调整顺序,符合开闭原则
  • 每个处理器单一职责
  • 流程清晰,像流水线一样直观

缺点

  • 链过长会性能下降
  • 调试麻烦
  • 若没设置好next,容易请求丢失

六、应用场景(极高频)

  • 权限拦截
  • 参数校验
  • 日志、监控、限流、熔断
  • 审批流(组长→经理→总监)
  • 过滤器、拦截器栈
  • 异常捕获链

经典框架:

  • Servlet Filter
  • Spring Interceptor
  • Spring Security 过滤器链
  • MyBatis 插件链
  • Netty ChannelPipeline

七、责任链 VS 迭代器 VS 命令

  • 责任链:请求按顺序流转处理
  • 迭代器:遍历集合元素
  • 命令:封装行为为对象,可撤销/排队

八、总结

  1. 责任链模式 = 流水线 + 层层处理
  2. 核心:请求顺着链走,解耦发送与接收
  3. 结构:Handlernext → 链式调用
  4. 企业开发最常用行为型模式之一,到处都是它的影子
相关推荐
kiki_24112 小时前
用IntelliJ IDEA编写Java程序,从0到1完整教程
java·ide·intellij-idea
liuyao_xianhui2 小时前
优选算法_锯齿形层序遍历二叉树_队列_C++
java·开发语言·数据结构·c++·算法·链表
八宝粥大朋友2 小时前
Android sqlite3 编译及安装
android·java·sqlite
wxm6312 小时前
TCP监听--监听指定IP的端口号
java·网络·tcp/ip
csdn2015_2 小时前
java 把对象转化为json字符串
java·前端·json
想带你从多云到转晴2 小时前
03、数据结构与算法--单向链表
java·数据结构·算法
无籽西瓜a2 小时前
【西瓜带你学设计模式 | 第七期 - 适配器模式】适配器模式 —— 类适配器与对象适配器实现、优缺点与适用场景
java·后端·设计模式·软件工程·适配器模式
Oliver_LaVine2 小时前
idea启动后端项目-控制台中文乱码处理
java·ide
Flittly2 小时前
【SpringAIAlibaba新手村系列】(6)PromptTemplate 提示词模板与变量替换
java·spring boot·agent