当前位置: 首页 > article >正文

【Java设计模式-7】责任链模式:我是流水线的一员

一、责任链(Chain of Responsibility Patten)模式是个啥?

想象一下,你要请假。你先把请假申请交给了小组长,小组长一看,这事儿他能决定,就直接批了。要是小组长觉得这事儿得往上汇报,就把申请递给了部门经理。部门经理有权限,就批了;要是经理觉得还得大老板定夺,就又传给大老板,大老板最后拍板。这就是责任链模式的一个生活场景示例。
在这里插入图片描述

在编程世界里,责任链模式定义为:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

简单来说,就是有一串对象排着队,一个请求来了,从第一个对象开始看能不能处理,如果能就处理了,如果不能就交给下一个对象,依次类推,直到请求被处理或者到了链的末尾。

二、责任链模式的结构和代码实现

结构

  1. 抽象处理者(Handler):定义一个处理请求的接口,包含一个后继处理者(successor)的引用,提供设置后继处理者的方法和处理请求的抽象方法。
  2. 具体处理者(ConcreteHandler):实现抽象处理者的处理请求方法,判断自己是否能处理请求,如果能则处理,否则将请求传递给后继处理者。

代码示例

// 抽象处理者
abstract class Handler {
    protected Handler successor;

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    public abstract void handleRequest(int request);
}

// 具体处理者1
class ConcreteHandler1 extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 0 && request < 10) {
            System.out.println("ConcreteHandler1 处理请求 " + request);
        } else if (successor!= null) {
            successor.handleRequest(request);
        }
    }
}

// 具体处理者2
class ConcreteHandler2 extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 10 && request < 20) {
            System.out.println("ConcreteHandler2 处理请求 " + request);
        } else if (successor!= null) {
            successor.handleRequest(request);
        }
    }
}

// 测试代码
public class ChainOfResponsibilityPattern {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();

        handler1.setSuccessor(handler2);

        int[] requests = {5, 15, 25};
        for (int request : requests) {
            handler1.handleRequest(request);
        }
    }
}

在这段代码中,我们创建了一个简单的责任链。ConcreteHandler1 可以处理 0 到 9 的请求,ConcreteHandler2 可以处理 10 到 19 的请求。当一个请求进来时,先由 handler1 尝试处理,如果处理不了就交给 handler2

三、Spring Boot 中的责任链模式应用场景

1. Filter 过滤器链

在 Spring Boot 中,Filter 就是责任链模式的典型应用。当一个 HTTP 请求进入应用时,会经过一系列的过滤器。每个过滤器都有自己的职责,比如验证用户身份、处理字符编码、记录日志等。

例如,我们有一个登录验证过滤器 LoginFilter,一个字符编码过滤器 EncodingFilter。当请求进来时,LoginFilter 先检查用户是否登录,如果已登录则放行,交给下一个过滤器 EncodingFilterEncodingFilter 负责设置字符编码,然后再将请求传递给后续的过滤器或者最终的控制器。

2. Interceptor 拦截器链

Interceptor 也是类似的原理。比如在一个电商系统中,我们可能有一个权限拦截器 PermissionInterceptor,用于检查用户是否有访问某个资源的权限;还有一个日志拦截器 LoggingInterceptor,用于记录用户的操作日志。请求进来后,先经过 PermissionInterceptor 检查权限,通过后再经过 LoggingInterceptor 记录日志,最后才到达目标方法。

3. 异常处理链

Spring Boot 的异常处理机制也用到了责任链模式。当程序抛出异常时,会按照一定的顺序寻找合适的异常处理器来处理。比如有一个全局异常处理器 GlobalExceptionHandler,处理一般性的异常;还有一个特定业务异常处理器 BusinessExceptionHandler,处理业务逻辑中抛出的特定异常。当异常发生时,先由 BusinessExceptionHandler 尝试处理,如果处理不了,就交给 GlobalExceptionHandler

四、总结

责任链模式就像是一场接力赛,请求在不同的处理者之间传递,直到被成功处理。它让代码更加灵活、可维护,不同的处理逻辑可以独立开发、修改和扩展。在 Spring Boot 中,这种模式被广泛应用于各种场景,帮助我们构建更加健壮、高效的应用程序。掌握责任链模式,能让我们在开发中更加得心应手,处理各种复杂的业务逻辑。希望大家通过这篇博客,对责任链模式有更深入的理解,并能在实际项目中灵活运用。


http://www.kler.cn/a/515862.html

相关文章:

  • Spring Security(maven项目) 3.0.2.6版本—总
  • 基于 WEB 开发的手机销售管理系统设计与实现内容
  • k8s的CICD实施项目
  • Plotly 函数图像绘制
  • yolov11 pose 推理代码
  • 软件测试入门—用例设计中的场景图和状态迁移图
  • No.37 笔记 | Python面向对象编程学习笔记:探索代码世界的奇妙之旅
  • 2.5英寸笔记本电脑机械硬盘拆解方法
  • vim查找如何忽略字母的大小写
  • Java算法——排序
  • PHP如何封装项目框架达到高可用、高性能、高并发
  • 嵌入式知识点总结 C/C++ 专题提升(七)-位操作
  • 精讲Python之turtle库(二):设置画笔颜色、回旋伞、变色回旋伞、黄色三角形、五角星,附源代码
  • python列表增加数据函数
  • flume和kafka整合 flume和kafka为什么一起用?
  • Redis数据库笔记——持久化机制
  • VScode+ESP-IDF搭建ESP32开发环境
  • 探索 LLM:从基础原理到 RAG 实现的深度解析
  • Spring注解篇:@PostMapping详解
  • MATLAB中regexptranslate函数用法
  • 主站集中式和分布式的配电自动化系统区别在哪里?各适用于什么场所?一文详解
  • 【YOLOv11改进[Backbone]】使用LSKNet替换Backbone | 用于遥感目标检测的大型选择性核网络 | 2023
  • plus.runtime.install在android10无效
  • 【番外篇】排列组合实现算法1(Java版)
  • notepad++下载安装及使用笔记
  • Redis - 数据类型与编码方式