责任链模式(处理逻辑解耦)

前言

使用设计模式的主要目的之一就是解耦,让程序易于维护和更好扩展。

责任链则是将处理逻辑进行解耦,将独立的处理逻辑抽取到不同的处理者中,每个处理者都能够单独修改而不影响其他处理者。

使用时,依次调用链上的处理者处理逻辑。

代码实战

Filter

过滤器是 Servlet 规范规定的,处理时机是在进入 servlet 容器之前

Filter 的 doFilter 方法第三个入参 FilterChain,即为过滤器调用链,通过它实现递归调用链上的过滤器 doFilter 方法,执行过滤处理逻辑(前置处理和后置处理)

@WebFilter (urlPatterns = "/test", filterName = "MyFilter ")
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException {//前置处理//递归调用过滤器链上的过滤器,过滤器 doFilter 方法依次入方法栈chain.doFilter(request, response);//当 FilterChain 上的过滤器都执行后,就会调用 servlet 的 service 方法//方法栈弹出 doFilter 方法,执行后置处理//后置处理}@Overridepublic void destroy() {}
}

ApplicationFilterChain 维护了过滤器配置列表和当前索引下标

ApplicationFilterChain 中 doFilter 方法里面调用私有方法 internalDoFilter,在私有方法中,根据当前索引下标调用链上的过滤器

如果过滤器都执行了,就调用 servlet

Interceptor

拦截器是 Spring 框架提供的功能,处理时机实在进入servlet 后,且在进入 controller 之前处理,具体的处理逻辑在 DispatcherServlet 的 doDispatch 中

从代码中可以看出来,拦截器的处理分为三个时机,前置处理,后置处理,以及完成后。

mappedHandler 即为拦截器调用链 HandlerExecutionChain

维护了拦截器列表和当前索引下标

调用拦截链时,其实就是遍历拦截器数组,判断是否合法

业务实战

在 Filter 和 Interceptor 中,应用的最小的颗粒度都是接口,通常它们都是用来处理一些与具体业务无关的功能

如果只需要应用在某一个方法上,在 spring 中可以依靠 IOC 容器和依赖注入来实现特定业务的责任链模式

比如在业务处理中需要对一批业务数据做各种校验

解耦出各个不同校验逻辑,注入 IOC 容器

public interface Handler {/*** 对参数进行处理* @param object* @return*/Object handle(Object object);
}/*** 指定注入顺序为1**/
@Order(1)
@Component
public class Handler1 implements Handler {//...省略
}/*** 指定注入顺序为2**/
@Order(2)
@Component
public class Handler2 implements Handler {//...省略
}/*** 指定注入顺序为3**/
@Order(3)
@Component
public class Handler3 implements Handler {//...省略
}@Component
public class HandleChain {@Autowiredprivate List<Handler> handleList;/*** 执行处理* @param context* @return*/public Object execute(Object object){for (OrderHandleIntercept handleIntercept : handleList) {object = handleIntercept.handle(object);}return object;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/280512.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零到一构建短链接系统(八)

1.git上传远程仓库&#xff08;现在才想起来&#xff09; git init git add . git commit -m "first commit" git remote add origin OLiyscxm/shortlink git push -u origin "master" 2.开发全局异常拦截器之后就可以简化UserController 拦截器可以…

Jackson 2.x 系列【3】解析器 JsonParser

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 解析原理3. 案例演示3.1 创建 JsonParser3.2 解析3.3 读取3.4 测试 1. 前…

C语言 指针练习

一、 a、b是两个浮点型变量&#xff0c;给a、b赋值&#xff0c;建立两个指针分别指向a的地址和b的地址&#xff0c;输出两个指针的值。 #include<stdio.h> int main() {float a,b,*p1,*p2;a10.2;b2.3;p1&a;p2&b;printf("a%f,b%f\n",a,b);printf("…

U-Net代码复现--更新中

本文记录自己的学习过程&#xff0c;内容包括&#xff1a; 代码解读&#xff1a;Pytorch-UNet 深度学习编程基础&#xff1a;Pytorch-深度学习&#xff08;新手友好&#xff09; UNet论文解读&#xff1a;医学图像分割&#xff1a;U_Net 论文阅读 数据&#xff1a;https://hack…

Java与Go:指针

在计算机内存中&#xff0c;每个变量都有一个唯一的地址&#xff0c;指针就是用来保存这个地址的变量。通过指针&#xff0c;我们可以间接地访问和修改存储在该地址处的数据。今天我们来聊一聊Java和Go指针&#xff0c;预告一下&#xff0c;我们需要借助C语言做一些小小的比较。…

基于cnn深度学习的yolov5+pyqt+分类+resnet+骨龄检测系统

往期热门博客项目回顾&#xff1a; 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 YOLOv5与骨龄识别 YOLOv5&a…

容器中的大模型(三)| 利用大语言模型:容器化高效地部署 PDF 解析器实践...

作者&#xff1a;宋文欣&#xff0c;智领云科技联合创始人兼CTO 01 简介 大语言模型&#xff08;LLMs&#xff09;正逐渐成为人工智能领域的一颗璀璨明星&#xff0c;它们的强大之处在于能够理解和生成自然语言&#xff0c;为各种应用提供了无限可能。为了让这些模型更好地服务…

网络编程:数据库

一、作业 1> 创建一个工人信息库&#xff0c;包含工号&#xff08;主键&#xff09;、姓名、年龄、薪资。 2> 添加三条工人信息&#xff08;可以完整信息&#xff0c;也可以非完整信息&#xff09; 3> 修改某一个工人的薪资&#xff08;确定的一个&#xff09; 4> …

[C++]20:unorderedset和unorderedmap结构和封装。

unorderedset和unorderedmap结构和封装 一.哈希表&#xff1a;1.直接定址法&#xff1a;2.闭散列的开放定址法&#xff1a;1.基本结构&#xff1a;2.insert3.find4.erase5.补充&#xff1a;6.pair<k,v> k的数据类型&#xff1a; 3.开散列的拉链法/哈希桶&#xff1a;1.基…

【计算机网络】计算机网络概述

文章目录 一、计算机网络的概念二、 计算机网络的功能1. 数据通信2. 资源共享3. 分布式处理4. 提高可靠性5. 负载均衡 补充&#xff1a; 计算机的发展阶段小结三、计算机网络的组成1. 组成部分2. 工作方式3. 功能组成 四、 计算机网络的分类1. 按分布范围2. 按使用者3. 按交换技…

零拷贝原理+kafka中的零拷贝

零拷贝原理kafka中的零拷贝 kafka性能之零拷贝传统IO零拷贝mmp优化sendfile优化sendfile DMA scatter/gather优化Kafka是怎么使用零拷贝的 kafka性能之零拷贝 kafka中的零拷贝并不是说完全避免了上下文切换与cpu拷贝的次数, 而是减少这种拷贝次数 传统IO 传统的一次IO流程 rea…

学习开发小程序的起航日记

2024年3月16日 不知不觉中三月份还只剩了一半的光景&#xff0c;我想写的内容还很多没有写&#xff0c;或者更应该说&#xff0c;是想积累的还有很多。现在最应该去完善Java的内容&#xff0c;可还是想先等等。想等搞清楚小程序部分&#xff0c;想等积累完小程序的内容。 这几…

华为综合案例-普通WLAN全覆盖配置(2)

组网图 结果验证 在AC_1和AC_2上执行display ap all命令&#xff0c;检查当前AP的状态&#xff0c;显示以下信息表示AP上线成功。[AC_1] display ap all Total AP information: nor : normal [1] ExtraInfo : Extra information P : insufficient power supply ---…

冒泡排序的原理及其实现

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 目录 前言 一、冒泡排序的原理 二、代码实现 总结 前言 本篇详细介绍了冒泡排序的原理及其实现&#xff0c;让使用者对冒泡排序的原理及其实现有进一步认识&#xff0c;而不是仅仅停留在表面&#xff0c;更好的模…

xercesc库保存XML功能实现

目录 一 参考链接 二 运行结果 三 代码 一 参考链接 DOM Programming Guide (apache.org) Xerces-c DOM XML文件的构造_xerces-c domimplementation-CSDN博客 Xerces-c库的使用-CSDN博客 二 运行结果 三 代码 #if 1//参考链接&#xff1a; https://blog.csdn.net/RGBMa…

流畅的 Python 第二版(GPT 重译)(九)

第四部分&#xff1a;控制流 第十七章&#xff1a;迭代器、生成器和经典协程 当我在我的程序中看到模式时&#xff0c;我认为这是一个麻烦的迹象。程序的形状应该只反映它需要解决的问题。代码中的任何其他规律性对我来说都是一个迹象&#xff0c;至少对我来说&#xff0c;这表…

【数据可视化】Echarts中的其它图表

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 绘制散点图2.1 绘制基本散点图2.2 绘制两个序列的散点图2.3 绘制带涟漪特效的散点图 3. 绘制气泡图3.1 绘制标准气泡图3.2 绘制各国人均寿命与GDP气泡图3.3 绘制城市A、城市B、城市C三个城市空气污染指数气…

Tech Talks技术讲座中文培训-报名学习LPWAN、Matter、蓝牙和Wi-Fi最新开发技能!

Silicon Labs&#xff08;亦称“芯科科技”&#xff09;主办新一轮2024年“亚太区Tech Talks在线技术讲座”即将在5月9日至8月8日&#xff08;中文系列场次&#xff09;&#xff0c;以及4月24日至8月7日&#xff08;英文系列场次&#xff09;正式展开&#xff0c;现正热烈报名中…

uniapp使用Canvas给图片加水印把临时文件上传到服务器

生成的临时路径是没有完整的路径没办法上传到服务器 16:37:40.993 添加水印后的路径, _doc/uniapp_temp_1710923708347/canvas/17109238597881.png 16:37:41.041 添加水印后的完整路径, file://storage/emulated/0/Android/data/com.jingruan.zjd/apps/__UNI__BE4B000/doc/…

ES 常见面试题及答案

目录 es 写入数据流程 es 删除数据流程 es 读数据流程 es 部署的服务有哪些角色 es 的实现原理 es 和lucence 关系 如何提高写入效率 提高搜索效率 es doc value指的啥 分片指的啥&#xff0c;定义后可不可义再修改 深分页如何优化 对于聚合操作是如何优化的 元数据…