Spring 设计模式之责任链模式
Spring 设计模式之责任链模式
- 责任链模式
- 用到的场景
- java举例
责任链模式
责任链模式(Chain of Responsibility)是一种行为设计模式,它允许你将请求沿着处理者链进行传递。
每个处理者可以对请求进行处理,也可以将请求传递给链中的下一个处理者。这个模式使得你可以在不修改对象间连接的情况下,动态地增加或删除责任。
用到的场景
强调链条传递,每一个环节都处理一下
1.入参校验
- 多级校验:将校验逻辑拆分为多个独立的处理器,每个处理器负责一种或多种校验规则。这些处理器形成一条链式调用,请求在处理器链上传递,如果校验条件不通过,则处理器不再向下传递请求,直接返回错误信息;若所有的处理器都通过检验,则继续执行后续的业务逻辑。
- 可复用性:校验处理器可以独立开发和测试,便于在不同场景下复用。
2. 权限校验
- 多级权限检查:将权限校验逻辑拆分为多个处理器,每个处理器负责一种或多种权限检查规则。这些处理器按顺序组成一条链,请求(如API调用或页面访问)在链上传递,每个处理器根据自己的职责检查请求是否满足相应的权限要求。
- 细粒度控制:通过多个处理器可以实现细粒度的权限控制,比如角色检查、资源权限检查、操作权限检查等。
- 动态调整:权限处理器可以动态地添加、删除或修改,以适应不同的安全需求或用户角色变化。
3. 工作流处理
- 任务分解:将复杂的工作流程分解为多个独立的处理步骤,每个步骤由一个或多个处理器负责。
- 顺序执行:处理器按照预设的顺序依次执行,每个处理器处理完自己的任务后,将请求传递给下一个处理器。
- 动态扩展:通过配置或编程方式动态地添加、删除或修改处理器,以适应不同的工作流程需求。
4. 事件处理
- 事件监听:在Spring框架中,可以使用责任链模式来监听和处理事件。每个处理器都可以注册为事件监听器,当事件发生时,按照注册的顺序依次调用处理器的处理方法。
- 事件分发:事件分发器负责将事件对象传递给链中的第一个处理器,处理器根据事件类型和自己的职责决定是否处理该事件,或者将事件传递给下一个处理器。
5. 异常处理
- 异常捕获:在业务逻辑执行过程中,可能会遇到各种异常情况。使用责任链模式可以将异常处理逻辑拆分为多个处理器,每个处理器负责捕获和处理一种或多种异常类型。
- 异常传递:当一个处理器无法处理当前异常时,可以将异常对象传递给下一个处理器,直到找到合适的处理器为止。
6. 请求处理
- 请求分发:在Web应用程序中,请求处理器可以形成一个责任链,用于处理不同类型的HTTP请求。每个处理器都可以根据自己的职责决定是否处理该请求,或者将请求传递给下一个处理器。
- 请求过滤:在请求到达控制器之前,可以使用责任链模式对请求进行过滤和预处理,比如身份验证、参数校验、日志记录等。
java举例
package com.example.customer.controller;// 定义一个处理请求的接口
interface Handler {// 设置下一个处理者void setNextHandler(Handler nextHandler);// 处理请求的方法void handleRequest(int days);
}// 具体的处理者类,比如部门经理,实现Handler接口
class DepartmentManager implements Handler {private Handler nextHandler;@Overridepublic void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleRequest(int days) {if (days <= 5) {System.out.println("部门经理批准了请假 " + days + " 天。");} else {if (nextHandler != null) {nextHandler.handleRequest(days);} else {System.out.println("没有合适的领导可以批准请假 " + days + " 天。");}}}
}// 具体的处理者类,比如总经理,实现Handler接口
class GeneralManager implements Handler {private Handler nextHandler;@Overridepublic void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleRequest(int days) {if (days <= 10) {System.out.println("总经理批准了请假 " + days + " 天。");} else {if (nextHandler != null) {nextHandler.handleRequest(days);} else {System.out.println("没有合适的领导可以批准请假 " + days + " 天。");}}}
}// 具体的处理者类,比如董事长,实现Handler接口
class Chairman implements Handler {@Overridepublic void setNextHandler(Handler nextHandler) {// 董事长作为最高级领导,不需要设置下一个处理者// 这里可以不做任何操作,或者抛出一个异常表示不应该调用此方法// 但为了符合接口定义,我们还是保留这个方法体为空}@Overridepublic void handleRequest(int days) {if (days > 10) {System.out.println("董事长批准了请假 " + days + " 天。");} else {// 理论上董事长不会处理小于等于10天的请假,但这里为了完整性加上System.out.println("董事长不处理小于等于10天的请假请求。");}// 注意:董事长没有下一个处理者,所以不需要调用nextHandler.handleRequest(days);}}public class ChainOfResponsibilityDemo {public static void main(String[] args) {// 创建处理者对象-部门经理Handler departmentManager = new DepartmentManager();// 创建处理者对象-总经理Handler generalManager = new GeneralManager();// 创建处理者对象-董事长Handler chairman = new Chairman();//设置部门经理下一个处理者总经理departmentManager.setNextHandler(generalManager);//设置总经理下一个处理者董事长generalManager.setNextHandler(chairman);// 提交请假请求departmentManager.handleRequest(3); // 该假条是部门经理进行批准的departmentManager.handleRequest(7); // 该假条是总经理进行批准的departmentManager.handleRequest(11); // 该假条是总经理进行批准的}
}
输出
部门经理批准了请假 3 天。
总经理批准了请假 7 天。
董事长批准了请假 11 天。
相关文章:
Spring 设计模式之责任链模式
Spring 设计模式之责任链模式 责任链模式用到的场景java举例 责任链模式 责任链模式(Chain of Responsibility)是一种行为设计模式,它允许你将请求沿着处理者链进行传递。 每个处理者可以对请求进行处理,也可以将请求传递给链中的…...
简单的 docker 部署ELK
简单的 docker 部署ELK 这是我的运维同事部署ELK的文档,我这里记录转载一下 服务规划 架构: Filebeat->kafka->logstash->ES kafka集群部署参照: kafka集群部署 部署服务程序路径/数据目录端口配置文件elasticsearch/data/elasticsearch9200/data/elas…...
四款主流的3D创作和游戏开发软件的核心特点和关系
四款主流的3D创作和游戏开发软件的核心特点和关系 3D建模软件: Blender: 开源免费,功能全面优点: 完全免费持续更新优化社区活跃,学习资源丰富功能全面(建模、动画、渲染等) 缺点: 学习曲线陡峭界面操作…...
聚划算!Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量回归预测
聚划算!Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量回归预测 目录 聚划算!Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 聚划算!Tran…...
信息安全工程师(76)网络安全应急响应技术原理与应用
前言 网络安全应急响应(Network Security Incident Response)是针对潜在或已发生的网络安全事件而采取的网络安全措施,旨在降低网络安全事件所造成的损失并迅速恢复受影响的系统和服务。 一、网络安全应急响应概述 定义:网络安全应…...
使用 OpenCV 实现图像的透视变换
概述 在计算机视觉领域,经常需要对图像进行各种几何变换,如旋转、缩放和平移等。其中,透视变换(Perspective Transformation)是一种非常重要的变换方式,它能够模拟三维空间中的视角变化,例如从…...
openGauss数据库-头歌实验1-4 数据库及表的创建
一、创建数据库 (一)任务描述 本关任务:创建指定数据库。 (二)相关知识 数据库其实就是可以存放大量数据的仓库,学习数据库我们就从创建一个数据库开始吧。 为了完成本关任务,你需要掌握&a…...
吉利极氪汽车嵌入式面试题及参考答案
inline 的作用 inline 是 C++ 中的一个关键字。它主要用于函数,目的是建议编译器将函数体插入到调用该函数的地方,而不是像普通函数调用那样进行跳转。 从性能角度来看,当一个函数被标记为 inline 后,在编译阶段,编译器可能会将函数的代码直接复制到调用它的位置。这样做…...
pycharm中的服务是什么?
在PyCharm中,服务是指允许在PyCharm中运行的一种功能或插件。服务可以是内置的,也可以是通过插件安装的。 一些常见的PyCharm服务包括: 调试服务:PyCharm提供了全功能的调试工具,可以帮助开发人员通过设置断点、监视变…...
[Unity Demo]从零开始制作空洞骑士Hollow Knight第十七集:制作第二个BOSS燥郁的毛里克
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作游戏第二个BOSS燥郁的毛里克 1.导入素材和制作相关动画1.5处理玩家受到战吼相关行为逻辑处理2.制作相应的行为控制和生命系统管理3.制作战斗场景和战斗…...
深度解析阿里的Sentinel
1、前言 这是《Spring Cloud 进阶》专栏的第五篇文章,这篇文章介绍一下阿里开源的流量防卫兵Sentinel,一款非常优秀的开源项目,经过近10年的双十一的考验,非常成熟的一款产品。 文章目录如下: 2、什么是sentinel&…...
Linux系统-日志轮询(logrotate)
作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 这是Linux进阶部分的最后一大章。讲完这一章以后,我们Linux进阶部分讲完以后,我们的Linux操作部分就…...
机器学习在时间序列预测中的应用与实现——以电力负荷预测为例(附代码)
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 随着数据采集技术的发展,时间序列数据在各个领域中的应用越来越广泛。时间序列预测旨在基于过去的时间数据来…...
白杨SEO:百度在降低个人备案类网站搜索关键词排名和流量?怎样应对?【参考】
很久没有写百度或者网站这块内容了,一是因为做百度网站朋友越来越少,不管是个人还是企业;二是百度上用户搜索与百度给到网站的流量都越来越少。 为什么想到今天又来写这个呢?因为上个月有个朋友来咨询我说网站百度排名全没了&…...
前端实现json动画(附带示例)
前端实现json动画(附带示例) 使用lottie制作动画。1.json动画2.实现效果3.git仓库4.运行5.json动画天堂6.代码7. 经常使用的方法 使用lottie制作动画。 1.json动画 废话不多说,直接看效果图2.实现效果 3.git仓库 https://gitee.com/chaiach…...
AI 写作(一):开启创作新纪元(1/10)
一、AI 写作:重塑创作格局 在当今数字化高速发展的时代,AI 写作正以惊人的速度重塑着创作格局。AI 写作在现代社会中占据着举足轻重的地位,发挥着不可替代的作用。 随着信息的爆炸式增长,人们对于内容的需求日益旺盛。AI 写作能够…...
C#-类:索引器
索引器作用:可以让我们以中括号的形式访问自定义类中的元素。 规则自己定,访问时和数组一样 适用于,在类中有数组变量时使用,可以方便的访问、进行逻辑处理 可以重载,结构体也支持索引器 一:索引器的语法…...
Neo4j Cypher WHERE子句详解 - 初学者指南
Neo4j Cypher WHERE子句详解 - 初学者指南 前言1. WHERE子句基础1.1 WHERE子句的本质1.2 示例数据 2. 基本用法2.1 节点属性过滤2.2 关系属性过滤 3. 高级过滤技巧3.1 字符串匹配3.2 正则表达式3.3 属性存在性检查 4. 列表和范围操作4.1 IN操作符4.2 范围查询 5. 空值处理5.1 默…...
【CSS】标准怪异盒模型
概念 CSS 盒模型本质上是一个盒子,盒子包裹着HTML 元素,盒子由四个属性组成,从内到外分别是:content 内容、padding 内填充、border 边框、外边距 margin 盒模型的分类 W3C 盒子模型(标准盒模型) IE 盒子模型(怪异盒模型) 两种…...
栈详解
目录 栈栈的概念及结构栈的实现数组栈的实现数组栈功能的实现栈的初始化void STInit(ST* pst)初始化情况一初始化情况二 代码栈的插入void STPush(ST* pst, STDataType x)代码 栈的删除void STPop(ST* pst)代码 栈获取数据STDataType STTop(ST* pst)代码 判断栈是否为空bool ST…...
为你的大模型应用快速接入Taotoken,Python调用只需三步
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为你的大模型应用快速接入Taotoken,Python调用只需三步 对于希望在自己的应用中集成大模型能力的开发者而言࿰…...
揭秘PSLab Web App硬件交互机制:functionList与硬件Handler工作原理
揭秘PSLab Web App硬件交互机制:functionList与硬件Handler工作原理 【免费下载链接】pslab-webapp-legacy PSLab Web App https://pslab.io 项目地址: https://gitcode.com/gh_mirrors/ps/pslab-webapp-legacy PSLab Web App是一款强大的开源硬件交互工具&a…...
Forza Painter终极指南:3分钟将任何图片变成专业车辆涂装
Forza Painter终极指南:3分钟将任何图片变成专业车辆涂装 【免费下载链接】forza-painter Import images into Forza 项目地址: https://gitcode.com/gh_mirrors/fo/forza-painter 还在为《极限竞速:地平线》系列游戏中复杂的车辆涂装设计而烦恼吗…...
2026学生背单词软件实测,这5款真心好用不踩坑
过去几年我们团队在帮助不同学段学生提升词汇量时,踩过不少坑:有的工具背词效率还行,但同步一塌糊涂;有的界面酷炫,算法推荐却毫无个性,仿佛在用十年前的技术。市面上背单词软件看似饱和,真正能…...
Qwen-Image-2512+LoRA:构建Godot原生像素素材生成管线
1. 这不是“AI画图”,而是一次像素艺术工作流的底层重写你有没有试过在Godot 4.x里导入一张用Qwen-VL或Stable Diffusion生成的“像素风”图?放大一看——边缘糊成一团,颜色溢出格子,连88的精灵都对不齐网格。我去年帮一个独立游戏…...
Agent驱动的机器学习 pipeline 全链路拆解,深度解析LLM+ML协同训练的4大范式演进
更多请点击: https://codechina.net 第一章:Agent驱动的机器学习 pipeline 全链路拆解,深度解析LLMML协同训练的4大范式演进 Agent驱动的机器学习 pipeline 正在重构传统ML工程范式——它不再将数据预处理、特征工程、模型训练与部署割裂为静…...
5个步骤在Windows Hyper-V上完美运行macOS虚拟机
5个步骤在Windows Hyper-V上完美运行macOS虚拟机 【免费下载链接】OSX-Hyper-V OpenCore configuration for running macOS on Windows Hyper-V. 项目地址: https://gitcode.com/gh_mirrors/os/OSX-Hyper-V 你是否想在Windows电脑上体验macOS的流畅操作?OSX-…...
攻克葫芦科转化难题:甜瓜高效遗传转化体系构建与服务实践
一、 引言 甜瓜(Cucumis meloL.)作为重要的葫芦科经济作物,其遗传转化是开展基因功能验证、分子育种及品质改良的关键技术瓶颈。由于甜瓜普遍存在基因型依赖性强、再生频率低等问题,建立一套稳定、高效的遗传转化体系对科研工作至…...
为什么92%的社交App在AI Agent接入后用户停留时长暴跌?——资深架构师亲授5层调优框架
更多请点击: https://kaifayun.com 第一章:为什么92%的社交App在AI Agent接入后用户停留时长暴跌? 当AI Agent以“智能助手”“聊天搭子”“情绪陪伴者”等名义大规模嵌入社交App时,产品团队普遍预期用户活跃度与停留时长将显著提…...
内容创作团队借助Taotoken调用不同模型生成多样化文案
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 内容创作团队借助Taotoken调用不同模型生成多样化文案 在内容创作领域,团队经常需要为不同平台和受众产出风格各异的文…...
