【24种设计模式】责任链模式(Chain of Responsibility Pattern)
责任链模式是一种行为设计模式,它允许你将请求沿着处理链进行传递,直到有一个处理者能够处理该请求为止。这种模式将请求的发送者和接收者解耦,使多个对象都有机会处理该请求。
责任链模式的结构
责任链模式由以下几个角色组成:
- 抽象处理者(Handler):定义了处理请求的接口,并维护一个指向下一个处理者的引用。
- 具体处理者(ConcreteHandler):实现了处理请求的方法,如果自己不能处理该请求,则将请求传递给下一个处理者。
- 客户端(Client):创建具体处理者的链,并将请求发送给第一个处理者。
示例代码
以下是一个简单的示例,展示了如何在一个餐厅点餐系统中使用责任链模式。
首先,定义一个抽象处理者接口:
public interface OrderHandler {void setNextHandler(OrderHandler nextHandler);void handleOrder(Order order);
}
然后,创建具体处理者类,分别处理不同类型的订单:
public class OnlineOrderHandler implements OrderHandler {private OrderHandler nextHandler;@Overridepublic void setNextHandler(OrderHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleOrder(Order order) {if (order.getType().equals("online")) {// 处理在线订单的逻辑System.out.println("处理在线订单:" + order);} else {// 将请求传递给下一个处理者nextHandler.handleOrder(order);}}
}public class PhoneOrderHandler implements OrderHandler {private OrderHandler nextHandler;@Overridepublic void setNextHandler(OrderHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleOrder(Order order) {if (order.getType().equals("phone")) {// 处理电话订单的逻辑System.out.println("处理电话订单:" + order);} else {// 将请求传递给下一个处理者nextHandler.handleOrder(order);}}
}public class WalkInOrderHandler implements OrderHandler {private OrderHandler nextHandler;@Overridepublic void setNextHandler(OrderHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handleOrder(Order order) {if (order.getType().equals("walk-in")) {// 处理现场订单的逻辑System.out.println("处理现场订单:" + order);} else {// 将请求传递给下一个处理者nextHandler.handleOrder(order);}}
}
在每个具体处理者中,根据订单的类型来判断是否能够处理该订单。如果能够处理,则执行相应的业务逻辑;否则,将订单传递给下一个处理者。
最后,在客户端创建处理者链并使用它来处理订单:
public class OrderHandlerChain {private OrderHandler firstHandler;public void addHandler(OrderHandler handler) {if (firstHandler == null) {firstHandler = handler;} else {OrderHandler currHandler = firstHandler;while (currHandler.getNextHandler() != null) {currHandler = currHandler.getNextHandler();}currHandler.setNextHandler(handler);}}public void handleOrder(Order order) {if (firstHandler != null) {firstHandler.handleOrder(order);}}
}public class Client {public static void main(String[] args) {OrderHandlerChain chain = new OrderHandlerChain();// 创建具体处理者OrderHandler onlineHandler = new OnlineOrderHandler();OrderHandler phoneHandler = new PhoneOrderHandler();OrderHandler walkInHandler = new WalkInOrderHandler();// 构建处理者链chain.addHandler(onlineHandler);chain.addHandler(phoneHandler);chain.addHandler(walkInHandler);// 创建订单Order order1 = new Order("online");Order order2 = new Order("phone");Order order3 = new Order("walk-in");// 处理订单chain.handleOrder(order1);chain.handleOrder(order2);chain.handleOrder(order3);}
}
在客户端的 main() 方法中,创建了具体处理者和处理者链,并构建了一个包含不同类型订单处理逻辑的责任链。然后,通过链式调用处理者的 handleOrder() 方法,将订单传递给责任链进行处理。
责任链模式的使用场景
责任链模式适用于以下情况:
- 当你希望多个对象都有机会处理请求,并且你不确定哪个对象会处理请求时。
- 当你希望在不显式指定接收者的情况下,将请求的发送者和接收者解耦。
- 当你希望动态地指定处理对象集合,并在处理链中添加或移除处理者时。
常见的应用场景包括:
- 日志记录系统:可以将日志请求沿着处理链传递,由不同的处理器负责处理不同级别的日志。
- 请求过滤器:可以使用责任链模式来处理请求过滤逻辑,例如对请求进行权限验证、防止恶意请求等。
- 用户界面事件处理:可以使用责任链模式来处理用户界面事件,例如鼠标点击、键盘输入等。
责任链模式可以帮助我们构建松耦合、灵活和可扩展的系统。通过使用责任链模式,我们可以轻松地添加、修改或移除处理者,以适应不同的业务需求。
希望这篇博客推文能够帮助你理解责任链模式,并在实际开发中得到应用!如果还有其他问题,请随时提问。
相关文章:
【24种设计模式】责任链模式(Chain of Responsibility Pattern)
责任链模式是一种行为设计模式,它允许你将请求沿着处理链进行传递,直到有一个处理者能够处理该请求为止。这种模式将请求的发送者和接收者解耦,使多个对象都有机会处理该请求。 责任链模式的结构 责任链模式由以下几个角色组成:…...
微信小程序一对多个页面间传递数据进行通信,事件触发的实现方法
在有些场景下,使用组件间通信或者组件和页面间通信并不可行。比如我需要只有一个websocket实例,并且需要向多个页面传递我接收到的消息。 下面的方法是一个页面向其它页面(触发事件)传递数据,其它页面也可以向这个页面…...
软件测试之Python基础学习
目录 一、Python基础 Python简介、环境搭建及包管理 Python简介 环境搭建 包管理 Python基本语法 缩进(Python有非常严格的要求) 一行多条语句 断行 注释 变量 基本数据类型(6种) 1. 数字Number 2. 字符串String 3. 列表List 4. 元组Tuple 序列相关操作方法 …...
模块化编程+LCD1602调试工具——“51单片机”
各位CSDN的uu们你们好呀,小雅兰又来啦,刚刚学完静态数码管显示和动态数码管显示,感觉真不错呢,下面,小雅兰就要开始学习模块化编程以及LCD1602调试工具的知识了,让我们进入51单片机的世界吧!&am…...
【Linux】UDP的服务端 + 客户端
文章目录 📖 前言1. TCP和UDP2. 网络字节序2.1 大小端字节序:2.2 转换接口: 3. socket接口3.1 sockaddr结构:3.2 配置sockaddr_in:3.3 inet_addr:3.4 inet_ntoa:3.5 bind绑定: 4. 服…...
德国自动驾驶卡车公司【Fernride】完成1900万美元A轮融资
来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,总部位于德国沃尔夫斯堡的自动驾驶卡车公司【Fernride】今日宣布已完成1900万美元A轮融资,本轮融资完成后Fernride的融资金额已经达到了达到5000万美元。 本轮融资由Deep Tech and Cli…...
实现水平垂直居中的十种方式
本文节选自我的博客:实现水平垂直居中的十种方式 💖 作者简介:大家好,我是MilesChen,偏前端的全栈开发者。📝 CSDN主页:爱吃糖的猫🔥📣 我的博客:爱吃糖的猫&…...
头条号热点采集工具-头条号热文采集软件
有一种魔法,能让信息传遍大地,让新闻在互联网上迅速传播,引发关注和讨论,那就是头条热点。无论你是一名自媒体创作者,还是一个信息追踪者,头条热点都是你不能忽视的宝贵资源。然而,如何获取这些…...
了解”变分下界“
“变分下界”:在变分推断中,我们试图找到一个近似概率分布q(x)来逼近真实的概率分布p(x)。变分下界是一种用于评估近似概率分布质量的指标,通常用来求解最优的近似分布。它的计算涉及到对概率分布的积分或期望的估计...
Andriod 简单控件
目录 一、文本显示1.1 设置文本内容1.2 设置文本大小1.3 设置文本颜色 二、视图基础2.1 设置视图宽高2.2 设置视图间距2.3 设置视图对齐方式 三、常用布局3.1 线性布局LinearLayout3.2 相对布局RelativeLayout3.3 网格布局GridLayout3.4 滚动视图ScrollView 四、按钮触控4.1 按…...
Substructure‑aware subgraph reasoning for inductive relation prediction
摘要 关系预测的目的是推断知识图中实体之间缺失的关系,其中归纳关系预测因其适用于新兴实体的有效性而广受欢迎。大多数现有方法学习逻辑组合规则或利用子图来预测缺失关系。尽管在性能方面已经取得了很大的进展,但目前的模型仍然不是最优的,因为它们捕获拓扑信息的能力有…...
古诗词学习鉴赏APP设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...
深度学习与python theano
文章目录 前言1.人工神经网络2.计算机神经网络3.反向传播4.梯度下降-cost 函数1.一维2.二维3.局部最优4.迁移学习 5. theano-GPU-CPU theano介绍1.安装2.基本用法1.回归2.分类 3.function用法4.shared 变量5.activation function6.Layer层7.regression 回归例子8.classificatio…...
【算法优选】双指针专题——贰
文章目录 😎前言🌲[快乐数](https://leetcode.cn/problems/happy-number/)🚩题目描述🚩题⽬分析:🚩算法思路:🚩代码实现: 🎋[盛水最多的容器](https://leetco…...
AI智能电话机器人实用吗
近几年,人工智能得到很大的发展,同时语音识别技术的不断完善,很多以语音识别为基础的应用涌现出来,尤其是最近3年,出现了很多智能电话机器人。百度开发者大会上展示了百度智能客服也吸引了很多人对智能电话机器人的兴趣…...
网络爬虫--伪装浏览器
从用户请求的Headers反反爬 在访问某些网站的时候,网站通常会用判断访问是否带有头文件来鉴别该访问是否为爬虫,用来作为反爬取的一种策略。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资…...
C/C++程序的内存开辟
前面我们说过,计算机中内存分为三个区域:栈区,堆区,静态区 但是这只是个简化的版本,接下来我们仔细看看内存区域的划分 C/C程序内存分配的几个区域: 栈区(stack):在执行…...
【Java 进阶篇】JDBC DriverManager 详解
JDBC(Java Database Connectivity)是 Java 标准库中用于与数据库进行交互的 API。它允许 Java 应用程序连接到各种不同的数据库管理系统(DBMS),执行 SQL 查询和更新操作,以及处理数据库事务。在 JDBC 中&am…...
2023年Linux总结常用命令
1.常用命令 1.1创建文件夹 mkdir -p forever/my 1.2当前目录 pwd 1.3创建文件 touch 1.txt 1.4查看文件 cat 1.txt 1.5复制文件 说明:-r是复制文件夹 cp -r my myCopy 1.6删除文件 说明:-r带包删除文件夹,-f表示强制删除(保存问题) rm -r…...
Mybatis3详解 之 全局配置文件详解
1、全局配置文件 前面我们看到的Mybatis全局文件并没有全部列举出来,所以这一章我们来详细的介绍一遍,Mybatis的全局配置文件并不是很复杂,它的所有元素和代码如下所示: <?xml version"1.0" encoding"UTF-8&…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
