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

server/2025/1/22 21:39:57/

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

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

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

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

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

结构

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

代码示例

java">// 抽象处理者
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 {@Overridepublic 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 {@Overridepublic 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.ppmy.cn/server/160568.html

相关文章

HUDI-0.11.0 BUCKET index on Flink 特性试用

1. 背景 在 0.10.1 版本下&#xff0c;使用默认的 index(FLINK_STATE)&#xff0c;在 upsert 模式下&#xff0c;几十亿级别的数据更新会消耗大量内存&#xff0c;并且检查点&#xff08;checkpoint&#xff09;时间过长。因此&#xff0c;切换到 0.11.0 的 BUCKET 索引。 当…

c++解决常见内存泄漏问题——智能指针的使用及其原理

目录 前言&#xff1a; 1. 智能指针的使用及其原理 1. 1 智能指针的使用场景分析 1.2 RAII和智能指针的设计思路 1.3 C标准库智能指针的使用 1.3 1 auto_ptr 1.3 2 unique_ptr 1.3 3 shared_ptr(重&#xff09; 1.3 4 weak_ptr 1.3 5 模拟实现删除器 2.智能指针的原…

关于在vue3中vue3-tree-org的简单应用

效果图如下&#xff1a; 主要围绕&#xff1a;属性的使用方式、样式等问题来展示。 文档在这里&#xff1a;vue3-tree-org <vue3-tree-org :data"treeData" center :horizontal"false" :toolBar"toolBar" on-node-click"handleTreeNod…

vscode导入模块不显示类型注解

目录结构&#xff1a; utils.py&#xff1a; import random def select_Jrandom(i:int, m:int) -> int:"""随机选择一个不等于 i 的整数"""j iwhile j i:j int(random.uniform(0, m))return jdef clip_alpha(alpha_j:float, H:float, L:f…

Visual Studio环境搭建Qgis二次开发环境

QGIS&#xff08;Quantum GIS&#xff09;是一款开源的地理信息系统软件&#xff0c;支持二次开发以满足特定的地理信息处理需求。二次开发通常涉及到使用QGIS提供的API和SDK来创建自定义插件或独立应用程序。以下是关于如何搭建QGIS二次开发环境的一些关键步骤和注意事项。 1…

Python 一步一步教你用pyglet制作汉诺塔游戏(续)

目录 汉诺塔游戏 7. 汉诺塔类 8. 移动圆盘 9. 移动演示 10. 递归问题 11. 任意展示 12. 鼠标操作 汉诺塔游戏 汉诺塔(Tower of Hanoi),是一个源于印度古老传说的益智玩具。这个传说讲述了大梵天创造世界的时候,他做了三根金刚石柱子,并在其中一根柱子上从下往上按…

基于SpringBoot+Vue旅游管理系统的设计和实现(源码+文档+部署讲解)

个人名片 &#x1f525; 源码获取 | 毕设定制| 商务合作&#xff1a;《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片环境需要技术栈功能介绍功能说明 环境需要 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&…

Python----Python高级(正则表达式:语法规则,re库)

一、正则表达式 1.1、概念 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、 regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff0…