设计模式(行为型模式)责任链模式
目录
- 一、简介
- 二、责任链模式
- 2.1、处理器接口
- 2.2、具体处理器类
- 2.3、使用
- 三、优点与缺点
一、简介
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理该请求为止。这种模式解耦了发送者和接收者之间的关系,允许多个对象对请求进行处理,但发送者无需知道请求的处理过程和最终哪个对象处理了它。
在责任链模式中,请求通常沿着一个对象链传递,每个处理者对象都包含了自己的处理逻辑和对下一个处理者的引用。当收到请求时,处理者可以选择自行处理、部分处理或将请求传递给链中的下一个处理者。该模式通常包含以下角色:
- Handler(抽象处理者): 定义了处理请求的接口,通常包含一个指向下一个处理者的引用。
- ConcreteHandler(具体处理者): 实现抽象处理者接口,在接收到请求后,如果能够处理则处理请求,否则将请求传递给下一个处理者。
责任链模式能够动态地建立请求的处理链,可以灵活地添加、移除或调整处理者对象,根据需求自由组合处理链。这样可以避免请求发送者和接收者之间的直接耦合,提高了系统的灵活性和可维护性。
二、责任链模式
当涉及责任链模式时,可以创建一个处理器接口 Logger 和具体的处理器类 DebugLogger、InfoLogger、WarningLogger、ErrorLogger 和 FatalLogger。每个处理器类都可以处理相应级别的日志,如果不能处理,则将日志传递给下一个处理器
2.1、处理器接口
// 处理器接口
public interface Logger {void setNextLogger(Logger nextLogger);void logMessage(int level, String message);
}
2.2、具体处理器类
DebugLogger
public class DebugLogger implements Logger {private Logger nextLogger;@Overridepublic void setNextLogger(Logger nextLogger) {this.nextLogger = nextLogger;}@Overridepublic void logMessage(int level, String message) {if (level <= 1) {System.out.println("Debug Logger: " + message);} else if (nextLogger != null) {nextLogger.logMessage(level, message);}}
}
InfoLogger
public class InfoLogger implements Logger {private Logger nextLogger;@Overridepublic void setNextLogger(Logger nextLogger) {this.nextLogger = nextLogger;}@Overridepublic void logMessage(int level, String message) {if (level <= 2) {System.out.println("Info Logger: " + message);} else if (nextLogger != null) {nextLogger.logMessage(level, message);}}
}
WarningLogger
public class WarningLogger implements Logger {private Logger nextLogger;@Overridepublic void setNextLogger(Logger nextLogger) {this.nextLogger = nextLogger;}@Overridepublic void logMessage(int level, String message) {if (level <= 3) {System.out.println("Warning Logger: " + message);} else if (nextLogger != null) {nextLogger.logMessage(level, message);}}
}
ErrorLogger
public class ErrorLogger implements Logger {private Logger nextLogger;@Overridepublic void setNextLogger(Logger nextLogger) {this.nextLogger = nextLogger;}@Overridepublic void logMessage(int level, String message) {if (level <= 4) {System.out.println("Error Logger: " + message);} else if (nextLogger != null) {nextLogger.logMessage(level, message);}}
}
FatalLogger
public class FatalLogger implements Logger {private Logger nextLogger;@Overridepublic void setNextLogger(Logger nextLogger) {this.nextLogger = nextLogger;}@Overridepublic void logMessage(int level, String message) {if (level <= 5) {System.out.println("Fatal Logger: " + message);} else if (nextLogger != null) {nextLogger.logMessage(level, message);}}
}
2.3、使用
// 测试类
public class ChainOfResponsibilityExample {public static void main(String[] args) {Logger debugLogger = new DebugLogger();Logger infoLogger = new InfoLogger();Logger warningLogger = new WarningLogger();Logger errorLogger = new ErrorLogger();Logger fatalLogger = new FatalLogger();// 构建责任链debugLogger.setNextLogger(infoLogger);infoLogger.setNextLogger(warningLogger);warningLogger.setNextLogger(errorLogger);errorLogger.setNextLogger(fatalLogger);// 测试责任链debugLogger.logMessage(2, "This is an info message.");debugLogger.logMessage(4, "This is an error message.");debugLogger.logMessage(5, "This is a fatal message.");}
}
运行结果:
Info Logger: This is an info message.
Error Logger: This is an error message.
Fatal Logger: This is a fatal message.
在这个示例中,我们创建了多个具体的处理器类来处理不同级别的日志。通过构建责任链,每个处理器类中实现了处理逻辑,并且能够将日志传递给下一个处理器,直至最终处理。在测试类中,演示了发送不同级别的日志请求,并观察责任链的处理过程。
三、优点与缺点
责任链模式有一些优点和缺点,让我们来看一下:
优点
- 降低耦合度: 将请求发送者和接收者解耦,发送者无需知道请求的处理者,也不需要知道请求是如何被处理以及谁来处理。
- 灵活性和可扩展性:可以动态地调整、增加或删除处理者对象,也可以改变它们之间的顺序,以满足不同的处理需求。
- 单一职责原则: 每个具体处理者都专注于自己的处理逻辑,使得系统更加符合单一职责原则。
缺点
- 请求处理不保证被执行:如果请求没有被任何处理者处理,可能会出现未处理的情况,这需要在设计时考虑清楚。
- 性能问题:如果责任链太长或者处理者逻辑过于复杂,可能会影响性能。同时,递归地向下传递请求可能会影响性能。
责任链模式适合处理对象之间存在多种处理方式的情况,但在使用时需要注意权衡,避免责任链过长、过于复杂,以及处理者责任划分不清晰等问题。
相关文章:
设计模式(行为型模式)责任链模式
目录 一、简介二、责任链模式2.1、处理器接口2.2、具体处理器类2.3、使用 三、优点与缺点 一、简介 责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理…...
HTTP和HTTPS区别!
http 是我们几乎天天都要打交道的东西,相关知识点有点多,所以也有不少面试必问的点,这里做了一些整理,帮且大家树立完整的 http 知识体系,对面试官说 so easy HTTP 的特点和缺点 特点:无连接、无状态、灵…...
麻将普通胡牌算法(带混)
最近在玩腾讯的麻将游戏,但是经常需要充值,于是就想自己实现一个简单的单机麻将游戏.第一个难点就是实现胡牌的判断.这里写一下心得. 术语 本文的胡牌是指手牌构成了3N2的牌型,即一对做将,剩下的牌均为刻子(3张一样的牌)或者顺子(3张连续的牌比如234饼). 下面就是一个14张牌…...
Rust结构体详解:定义、使用及方法
Rust 是一门强调安全性和性能的系统级编程语言,它引入了结构体(struct)作为一种自定义的数据类型,允许程序员以更加灵活的方式组织和操作数据。在本篇博客中,我们将深入探讨 Rust 结构体的定义、使用以及相关概念。 什…...
LeetCode、435. 无重叠区间【中等,贪心 区间问题】
文章目录 前言LeetCode、435. 无重叠区间【中等,贪心 区间问题】题目链接及分类思路贪心、区间问题 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技…...
【实战】一、Jest 前端自动化测试框架基础入门(三) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(三)
文章目录 一、Jest 前端自动化测试框架基础入门7.异步代码的测试方法8.Jest 中的钩子函数9.钩子函数的作用域 学习内容来源:Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程,我在学习开始时(2023.08)采用的是当前最新版本&a…...
信息学奥赛一本通1228:书架
1228:书架 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 18190 通过数: 10557 【题目描述】 John最近买了一个书架用来存放奶牛养殖书籍,但书架很快被存满了,只剩最顶层有空余。 John共有N�头奶牛(1≤N≤20,0001≤…...
红队打靶练习:GLASGOW SMILE: 1.1
目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb 目录探测 1、gobuster 2、dirsearch WEB web信息收集 /how_to.txt /joomla CMS利用 1、爆破后台 2、登录 3、反弹shell 提权 系统信息收集 rob用户登录 abner用户 penguin用户 get root flag 信息收集…...
网络安全的今年:量子、生成人工智能以及 LLM 和密码
尽管世界总是难以预测,但网络安全的几个强劲趋势表明未来几个月的发展充满希望和令人担忧。有一点是肯定的:2024 年将是非常重要且有趣的一年。 近年来,人工智能(AI)以令人难以置信的速度发展,其在网络安全…...
【FPGA】Verilog:奇偶校验位发生器 | 奇偶校验位校验器
目录 0x00 奇偶校验位发生器 0x01 奇偶校验位校验器 0x02 错误检测器和纠错器...
【心得】关于STM32中RTC的校准方法
最近看了一些关于RTC校准的帖子,发现很多人存在疑惑。正好最近我也在STM32中实现了RTC校准。发些心得。这些对老手来说有些罗索,但对新手有益处。 实现RTC 校准的核心之一是库文件Stm321f0x_bkp.c中的void BKP_SetRTCCalibrationValue (uint8_t Calibra…...
消息中间件面试篇
目录 消息中间件 RabbitMQ 消息不丢失 生产者确认机制 消息持久化 交换机持久化 队列持久化 消息持久化 消费者确认 消息重复消费 出现的场景 解决方案 每条消息设置一个唯一的标识id 幂等方案:【 分布式锁、数据库锁(悲观锁、乐观锁&#…...
【MySQL】-20 MySQL综合-6(MySQL创建数据表+MySQL修改数据表+MySQL删除数据表)
MySQL创建数据表MySQL修改数据表MySQL删除数据表 MySQL创建数据表基本语法在指定的数据库中创建表查看表结构 MySQL修改数据表基本语法添加字段修改字段数据类型删除字段修改字段名称修改表名 MySQL删除数据表基本语法删除表 MySQL创建数据表 在创建数据库之后,接下…...
linux查看当前连接的IP
linux下查询当前所有连接的ip_linux查看某个ip的连接-CSDN博客 netstat -ntu | grep tcp | awk {print $5} | cut -d: -f1 | sort | uniq -c | sort -nr...
洛谷_P1923 【深基9.例4】求第 k 小的数_python写法
哪位大佬可以出一下这个的题解?????话说蓝桥杯可以用numpy库吗?????? 这道题有一个很简单的思路就是排序完成之后再访问。 but有很大的问题&…...
【MySQL】学习约束和使用图形化界面创建表
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-iqtbME2KmWpQFQSt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...
QGIS编译(跨平台编译)之四十八:pixman编译(Windows、Linux、MacOS环境下编译)
文章目录 一、pixman介绍二、pixman下载三、Linux下编译四、MacOS下编译五、Windows下编译一、pixman介绍 Pixman 是一个开源的图形库,它提供了底层像素操作功能,包括像素格式转换、图像合成、图像缩放、图像旋转等多种操作。Pixman 主要被用作 Cairo 图形库的后端,支持 Ca…...
华为数通方向HCIP-DataCom H12-821题库(单选题:441-460)
第441题 下面是一台路由输出的信息,关于这段信息描述正确的是 <R1>display bgp peerBGP local router ID : 2.2.2.2Local AS number : 100Total number of peers : 2 Peers in established state : 0Peer V AS MsgRcvd MsgSent OutQ Up/Down …...
【sass】 中使用 /deep/ 修改 elementUI 组件样式报错
element plus 想要覆盖组件的样式,想到了/deep/样式穿透,但样式一直不生效,代码如下: <style scoped lang"sass"> .main_wrapper{padding: 0 53pxposition: relativetop: -20px } >>> .el-tabs__item{h…...
Python算法题集_排序链表
Python算法题集_排序链表 题148:排序链表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【冒泡大法】2) 改进版一【列表排序】3) 改进版二【数值归并排序】4) 改进版三【快慢指针归并排序】 4. 最优算法 本文为Python算法题集之一的…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...
