【设计模式】责任链模式
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
介绍
意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
何时使用:在处理消息的时候以过滤很多道。
如何解决:拦截的类都实现统一接口。
关键代码:Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。
应用实例: 1、红楼梦中的"击鼓传花"。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。
优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。
缺点: 1、不能保证请求一定被接收。 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 3、可能不容易观察运行时的特征,有碍于除错。
使用场景: 1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3、可动态指定一组对象处理请求。
注意事项:在 JAVA WEB 中遇到很多应用。
实现
我们创建抽象类 AbstractLogger,带有详细的日志记录级别。然后我们创建三种类型的记录器,都扩展了 AbstractLogger。每个记录器消息的级别是否属于自己的级别,如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器。

步骤 1
创建抽象的记录器类。
AbstractLogger.java
public abstract class AbstractLogger {public static int INFO = 1;public static int DEBUG = 2;public static int ERROR = 3;protected int level;//责任链中的下一个元素protected AbstractLogger nextLogger;public void setNextLogger(AbstractLogger nextLogger){this.nextLogger = nextLogger;}public void logMessage(int level, String message){if(this.level <= level){write(message);}if(nextLogger !=null){nextLogger.logMessage(level, message);}}abstract protected void write(String message);}
步骤 2
创建扩展了该记录器类的实体类。
ConsoleLogger.java
public class ConsoleLogger extends AbstractLogger {public ConsoleLogger(int level){this.level = level;}@Overrideprotected void write(String message) { System.out.println("Standard Console::Logger: " + message);}
}
ErrorLogger.java
public class ErrorLogger extends AbstractLogger {public ErrorLogger(int level){this.level = level;}@Overrideprotected void write(String message) { System.out.println("Error Console::Logger: " + message);}
}
FileLogger.java
public class FileLogger extends AbstractLogger {public FileLogger(int level){this.level = level;}@Overrideprotected void write(String message) { System.out.println("File::Logger: " + message);}
}
步骤 3
创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。
ChainPatternDemo.java
public class ChainPatternDemo {private static AbstractLogger getChainOfLoggers(){AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);errorLogger.setNextLogger(fileLogger);fileLogger.setNextLogger(consoleLogger);return errorLogger; }public static void main(String[] args) {AbstractLogger loggerChain = getChainOfLoggers();loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");loggerChain.logMessage(AbstractLogger.DEBUG, "This is a debug level information.");loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information.");}
}
步骤 4
执行程序,输出结果:
Standard Console::Logger: This is an information.
File::Logger: This is a debug level information.
Standard Console::Logger: This is a debug level information.
Error Console::Logger: This is an error information.
File::Logger: This is an error information.
Standard Console::Logger: This is an error information.
相关文章:
【设计模式】责任链模式
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者…...
解密人工智能:线性回归 | 逻辑回归 | SVM
文章目录 1、机器学习算法简介1.1 机器学习算法包含的两个步骤1.2 机器学习算法的分类 2、线性回归算法2.1 线性回归的假设是什么?2.2 如何确定线性回归模型的拟合优度?2.3 如何处理线性回归中的异常值? 3、逻辑回归算法3.1 什么是逻辑函数?…...
【FFMPEG应用篇】使用FFmpeg的常见问题
拼接视频的问题 在使用ffmpeg进行视频拼接时,可能会遇到一些常见问题。以下是这些问题及其解决方法: 1. 视频格式不兼容:如果要拼接的视频格式不同,ffmpeg可能会报错。解决方法是使用ffmpeg进行格式转换,将所有视频转…...
(vue)获取对象的键遍历,同时循环el-tab页展示key及内容
(vue)获取对象的键遍历,同时循环el-tab页展示key及内容 效果: 数据结构: "statusData": {"订购广度": [ {"id": 11, "ztName": "广", …...
【严重】Smartbi未授权设置Token回调地址获取管理员权限
漏洞描述 Smartbi是一款商业智能应用,提供了数据集成、分析、可视化等功能,帮助用户理解和使用他们的数据进行决策。 在 Smartbi 受影响版本中存在Token回调地址漏洞,未授权的攻击者可以通过向目标系统发送POST请求/smartbix/api/monitor/s…...
北京鸟巢门票多少,里面有什么好玩的
北京鸟巢门票多少,里面有什么好玩的 北京鸟巢的门票是100元,里面有很多运动设施,“鸟巢”结构设计奇特新颖,而这次搭建它的钢结构的Q460也有很多独到之处:Q460是一种低合金高强度钢,它在受力强度达到460兆帕…...
4路光栅尺磁栅尺编码器5MHz高速差分信号转Modbus TCP网络模块 YL97
特点: ● 光栅尺磁栅尺解码转换成标准Modbus TCP协议 ● 光栅尺5V差分信号直接输入,4倍频计数 ● 模块可以输出5V的电源给光栅尺供电 ● 高速光栅尺磁栅尺计数,频率可达5MHz ● 支持4个光栅尺同时计数,可识别正反转 ● 可网…...
金蝶云星空对接打通旺店通·企业奇门组装拆卸单查询接口与创建其他出库单接口
金蝶云星空对接打通旺店通企业奇门组装拆卸单查询接口与创建其他出库单接口 编辑 源系统:金蝶云星空 金蝶K/3Cloud(金蝶云星空)是移动互联网时代的新型ERP,是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人…...
卫星--夏令营
几何问题:就是用几何数学知识解题即可 但是越是数学编程题,越容易忽略数学题中的细节 1.地球半径你算进去了吗? 2.sin三角函数,M_PI标准圆周率在cmath文件里 3.有可能给出的夹角超过180呢,没给数据要求,就要自己考…...
Kafka的下载安装以及使用
一、Kafka下载 下载地址:https://kafka.apache.org/downloads 二、Kafka安装 因为选择下载的是 .zip 文件,直接跳过安装,一步到位。 选择在任一磁盘创建空文件夹(不要使用中文路径),解压之后把文件夹内容…...
数据库相关面试题
巩固基础,砥砺前行 。 只有不断重复,才能做到超越自己。 能坚持把简单的事情做到极致,也是不容易的。 mysql怎么优化 : MySQL的优化可以从以下几个方面入手: 数据库设计优化:合理设计表结构,选择合适的数…...
Ubuntu常用配置
文章目录 1. 安装VMware虚拟机软件2. 下载Ubuntu镜像3. 创建Ubuntu虚拟机4. 设置屏幕分辨率5. 更改系统语言为中文6. 切换中文输入法7. 修改系统时间8. 修改锁屏时间9. 通过系统自带的应用商店安装软件10. 安装JDK11. 安装 IntelliJ IDEA12. 将左侧任务栏自动隐藏13. 安装docke…...
win10MySQLServer安装过程+解决MySQL服务无法启动问题
本次使用的版本是 Server version: 8.0.33 MySQL Community Server 安装详解 首先去官网下载社区版,比如我用的是mysql-8.0.33-winx64.zip,解压到文件夹:D:\Program Files\mysql-8.0.33-winx64 用管理员身份运行cmd,进到bin目录…...
网络:CISCO、Huawei、H3C命令对照
思科、华为、锐捷命令对照表 编号思科华为锐捷命令解释1 2writesavesave保存3456 如果你所处的视图为非系统视图,需要查看配置的时候,需要在该配置命令前加do。 在特定的视图之下,有对应的特定命令。例如,在接口视图下的ip addre…...
题目:2319.判断矩阵是否是 X 矩阵
题目来源: leetcode题目,网址:2319. 判断矩阵是否是一个 X 矩阵 - 力扣(LeetCode) 解题思路: 遍历矩阵,对于每一个节点,先判断是否处于主对角线或副对角线上,然后判…...
2023年大厂前端面试题汇总
一、58同城前端面试题27道 1. css盒模型 2. css画三角形 3. 盒子水平垂直居中(所有方式) 4. 重绘、重排 重绘就是重新绘制(repaint):是在一个元素的外观被改变所触发的浏览器行为,浏览器会根据元素的新属性…...
如何在Linux中查找Nginx安装目录
一、通过which命令查找 $ which nginx /usr/sbin/nginxwhich命令会在系统环境变量PATH中查找nginx可执行文件,并返回路径。因此,通过which命令可以很容易地找到系统中nginx的安装位置。 二、通过whereis命令查找 $ whereis nginx nginx: /usr/sbin/ng…...
【NLP】训练LLM的不同方式
一、说明 在大型语言模型(LLM)领域,有各种各样的 训练机制,具有不同的手段,要求和目标。由于它们服务于不同的目的,因此重要的是不要将它们相互混淆,并了解它们适用的不同场景。 在本文中&#…...
MySQL 45讲笔记(1-10讲)
1. SQL语句如何开始执行? MySQL分为Server和存储引擎两部分: Server层包含连接器、存储缓存、分析器、执行器等,以及所有的内置函数(事件、日期)等等,还有视图、触发器。 存储引擎是负责数据的存储和提取&a…...
U盘数据如何保密?U盘数据加密软件合集
当我们将重要数据存放在U盘中时,必须要保障U盘的安全,以避免数据泄露。那么,U盘数据该如何保密呢?下面我们就来盘点一下那些好用的U盘数据保护方法。 U盘写保护 起初U盘写保护是专门为U盘防病毒而设计的,写保护后会将…...
华中科技大学本科毕业论文LaTeX模板完整使用指南:快速上手终极教程
华中科技大学本科毕业论文LaTeX模板完整使用指南:快速上手终极教程 【免费下载链接】HUSTPaperTemp 华中科技大学本科毕业论文LaTeX模板 2017 项目地址: https://gitcode.com/gh_mirrors/hu/HUSTPaperTemp 对于华中科技大学的本科生来说,毕业论文…...
别再写错Verilog三态门了!一个assign语句搞定FPGA双向IO(附仿真避坑指南)
Verilog三态门实战指南:从代码误区到仿真验证 双向IO设计是FPGA开发中绕不开的经典问题,而三态门作为实现双向传输的核心元件,其代码写法看似简单却暗藏玄机。不少工程师在项目后期才发现三态门行为异常,仿真结果与预期不符&#…...
激光雕刻入门指南:5分钟掌握LaserGRBL完整使用技巧
激光雕刻入门指南:5分钟掌握LaserGRBL完整使用技巧 【免费下载链接】LaserGRBL Laser optimized GUI for GRBL 项目地址: https://gitcode.com/gh_mirrors/la/LaserGRBL 想要轻松操控激光雕刻机却担心操作复杂?LaserGRBL激光雕刻软件为你提供了完…...
深夜告警炸裂?这份Linux故障排查“作战地图”请收好诺
先唠两句:参数就像餐厅点单 把API想象成一家餐厅的“后厨系统”。 ? 路径参数/dishes/{dish_id} -> 好比你要点“宫保鸡丁”这道具体的菜,它是菜单(资源路径)的一部分。查询参数/dishes?spicytrue&typeSichuan -> 好比…...
iframe加载卡顿?教你用Vue+Element写一个带重试按钮的智能loading组件
VueElement打造智能iframe加载组件:网络异常处理实战 当我们在SaaS平台中嵌入第三方文档或应用时,iframe的加载体验往往成为用户满意度的关键指标。特别是在网络波动环境下,传统的loading动画可能让用户陷入无限等待的困境。本文将带你开发一…...
瀚高数据库常见操作命令
1、pg_dump数据备份pg_dump -U sysdba -h localhost -p 5866 -d db1 -F c -f /bak/db1_backup.dump报权限错误,调整一下PGOPTIONS"-c compatible_dbnone" pg_dump -U sysdba -h localhost -p 5866 -d universityweb05 -F c -f /bak/universityweb05_backu…...
FreeMove:Windows目录迁移终极解决方案,98%成功率释放C盘空间
FreeMove:Windows目录迁移终极解决方案,98%成功率释放C盘空间 【免费下载链接】FreeMove Move directories without breaking shortcuts or installations 项目地址: https://gitcode.com/gh_mirrors/fr/FreeMove 你是否经常因为C盘空间不足而烦恼…...
tao-8k嵌入模型惊艳体验:Xinference WebUI界面操作,效果一目了然
tao-8k嵌入模型惊艳体验:Xinference WebUI界面操作,效果一目了然 1. tao-8k模型核心能力展示 tao-8k是由Hugging Face开发者amu研发的开源文本嵌入模型,专注于将文本转换为高维向量表示。这款模型最引人注目的特点是支持长达8192个token的上…...
atopile生态系统探索:如何利用包管理器加速硬件开发
atopile生态系统探索:如何利用包管理器加速硬件开发 【免费下载链接】atopile Design circuit boards with code! ✨ Get software-like design reuse 🚀, validation, version control and collaboration in hardware; starting with electronics ⚡️ …...
Qwen2.5-7B-Instruct镜像免配置:5分钟完成7B模型本地对话服务
Qwen2.5-7B-Instruct镜像免配置:5分钟完成7B模型本地对话服务 想体验7B大模型的强大推理能力,又担心复杂的部署流程和显存爆炸?今天,我们带来一个开箱即用的解决方案。基于阿里通义千问官方旗舰版Qwen2.5-7B-Instruct模型&#x…...
