设计模式【行为型】-- 责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象依次处理同一个请求,形成一条责任链。当客户端提交一个请求时,请求沿着责任链传递,直到有一个处理者能够处理该请求为止。
概念:
在责任链模式中,通常有一个抽象处理者(Handler)类,它定义了处理请求的接口和一个后继处理者的引用。具体处理者(ConcreteHandler)继承抽象处理者,并实现请求处理的方法。每个具体处理者都决定自己能处理哪些请求,如果不能处理,则将请求传递给下一个处理者。
优点:
- 解耦: 将请求的发送者和接收者解耦,请求者不需要知道谁将处理请求,处理者也不需要知道请求的发送者是谁。
- 灵活性: 可以动态地新增或修改处理者,改变责任链结构,灵活地处理请求。
- 单一职责: 每个具体处理者只需关注自己能够处理的请求,符合单一职责原则。
缺点:
- 无保障完成: 请求可能到达链末端而得不到处理,需要事先设置好默认的处理方式或保证有一个终止处理者。
- 性能考虑: 链过长时,请求可能需要遍历整个链才能找到合适的处理者。
使用场景:
- 多级审批流程:如请假审批、报销审批等,不同级别的领导可以作为具体处理者,形成一条责任链。
- 日志记录:不同级别的日志处理器可以组成责任链,将日志信息传递给不同的处理器处理。
- 用户权限验证:多个验证器形成责任链,依次进行用户权限验证。
案例:
假设有一个电商系统,用户下单后,需要依次进行库存检查、优惠券验证、支付处理等操作。如果其中一环出现问题,后续操作将无法继续进行。
// 订单类
class Order {private String orderNumber;private double totalAmount;private String couponCode;public Order(String orderNumber, double totalAmount, String couponCode) {this.orderNumber = orderNumber;this.totalAmount = totalAmount;this.couponCode = couponCode;}public String getOrderNumber() {return orderNumber;}public double getTotalAmount() {return totalAmount;}public String getCouponCode() {return couponCode;}
}// 抽象处理者
abstract class OrderHandler {protected OrderHandler successor;public void setSuccessor(OrderHandler successor) {this.successor = successor;}public abstract void handleOrder(Order order);
}// 具体处理者 - 库存检查
class StockCheckHandler extends OrderHandler {public void handleOrder(Order order) {if (checkStock(order)) {System.out.println("库存检查通过,订单号:" + order.getOrderNumber());if (successor != null) {successor.handleOrder(order);}} else {System.out.println("库存不足,无法处理订单:" + order.getOrderNumber());}}private boolean checkStock(Order order) {// 检查库存是否足够// 省略具体实现return true;}
}// 具体处理者 - 优惠券验证
class CouponValidationHandler extends OrderHandler {public void handleOrder(Order order) {if (validateCoupon(order)) {System.out.println("优惠券验证通过,订单号:" + order.getOrderNumber());if (successor != null) {successor.handleOrder(order);}} else {System.out.println("优惠券验证失败,无法处理订单:" + order.getOrderNumber());}}private boolean validateCoupon(Order order) {// 验证优惠券是否有效// 省略具体实现return true;}
}// 具体处理者 - 支付处理
class PaymentHandler extends OrderHandler {public void handleOrder(Order order) {if (processPayment(order)) {System.out.println("支付处理完成,订单号:" + order.getOrderNumber());// 这是最后一环,不再调用 successor.handleOrder(order);} else {System.out.println("支付处理失败,无法处理订单:" + order.getOrderNumber());}}private boolean processPayment(Order order) {// 处理支付逻辑// 省略具体实现return true;}
}// 客户端代码
public class Client {public static void main(String[] args) {OrderHandler stockCheckHandler = new StockCheckHandler();OrderHandler couponValidationHandler = new CouponValidationHandler();OrderHandler paymentHandler = new PaymentHandler();stockCheckHandler.setSuccessor(couponValidationHandler);couponValidationHandler.setSuccessor(paymentHandler);Order order = new Order("12345", 100, "DISCOUNT_10_OFF");stockCheckHandler.handleOrder(order);}
}
在上述案例中,每个具体处理者都专注于自己的责任,并通过 setSuccessor 方法将责任传递给下一个处理者。当客户端提交一个订单时,订单会依次经过库存检查、优惠券验证和支付处理,只有在责任链上的所有处理者都处理成功时,订单才能被完整地处理。
相关文章:
设计模式【行为型】-- 责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象依次处理同一个请求,形成一条责任链。当客户端提交一个请求时,请求沿着责任链传递,直到有一个处理者能够处理该请求为止。…...
[Spring] 三级缓存解决循环依赖详解
什么是循环依赖 注册一个bean对象的过程: Spring扫描class得到BeanDefinition – 根据得到的BeanDefinition去生成bean – 现根据class推断构造方法 – 根据推断出来的构造方法,反射,得到一个对象 – 填充初始对象中的属性(依赖注入) – 如果…...
gerrit 从安装到出坑
一般公司在做代码审核的时候选择codereview gerrit来处理代码的入库的问题。 它是通过提交的时候产生Change-Id: If4e0107f3bd7c5df9e2dc72ee4beb187b07151b9 来决定是不是入库,一般如果不是通过这个管理,那么就是我们通常的操作 git add . git comm…...
Java工程师就业前景怎么样?能拿多少工资?
Java软件工程师是指运用Java这个开发工具去完成软件产品的软件程序设计、开发、测试、维护升级等工作的人员。Java程序员可以分为初级、中级、高级、资深等。不同级别的Java程序员,薪资也不一样。 Java除了一般的编程,还可以开发游戏、进行桌面设计、Ja…...
极速跳板机登陆服务器
目录 一:简单登陆跳板器二:一键申请相关的服务器权限三:简化登陆 一:简单登陆跳板器 登陆公司提供的网址, 下载自己的专属RSA密钥。在密钥文件处, 执行登陆指令: ssh -p 36000 -i id_rsa 用户跳…...
【算法与数据结构】226、LeetCode翻转二叉树
文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:这道题的思路很简单,本质上就是遍历每一个节点,然后交换左右节点。我们可以用前…...
metaRTC6.0 new feature (一)
概要 metaRTC6.0社区版最新版是6.0.212,标准版最新版本是6.0.276,企业版基础版最新版本是6.0.362,在企业版和标准版新增了一些实用功能模块,文件数字证书模块将并入社区版。 New Feature rtsp协议支持 新增rtsp协议࿰…...
聊天机器人如何增加电子商务销售额
聊天机器人和自动化对企业和客户来说都是福音。自动对话和聊天机器人(以下统称为“自动化”)通过自动回答问题或分配会话信息来帮助用户浏览品牌网站或电商商店。即时答案对客户来说非常有用,使用自动化也可以让原本与客户聊天的客服员工专注…...
stm32 IIC通信
文章目录 IIC 通信一、硬件电路二、IIC时序基本单元三、IIC时序1.指定地址写2.当前地址读3.指定地址读 IIC 通信 IIC总线是一种通用数据总线,有两根通信线(SCL(串行时钟总线),SDA(串行数据总线))。 特点:同…...
Elasticsearch监控工具Cerebro安装
Elasticsearch监控工具Cerebro安装 1、在windwos下的安装 1.1 下载安装包 https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4.zip 1.2 解压 1.3 修改配置文件 如果需要修改相关信息,编辑C:\zsxsoftware\cerebro-0.9.4\conf\applica…...
RTOS 低功耗设计原理及实现
RTOS 低功耗设计原理及实现 文章目录 RTOS 低功耗设计原理及实现👨🏫前言👨🔬Tickless Idle Mode 的原理及实现👨🚀Tickless Idle Mode 的软件设计原理👨💻Tickless Idle Mo…...
PaddleOCR C++编译出错解决方案
文章目录 前言一、环境准备1、主要环境2、源码下载3、C推理库下载 二、报错信息1.静态库调用错误2.ld returned 1 exit status 总结 前言 最近,想尝试下PaddleOCR的C推理,但是过程不如人所愿,除了很多问题,这里捡重点的说下吧&…...
89、简述RabbitMQ的架构设计
简述RabbitMQ的架构设计 BrokerQueueExchangeRoutingKeyBinding信道架构设计图Broker RabbitMQ的服务节点 Queue 队列,是RabbitMQ的内部对象,用于存储消息。RabbitMQ中消息只能存储在队列中。生产者投递消息到队列,消费者从队列中获取消息并消费。多个消费者可以订阅同一…...
63 | 图像处理
文章目录 Python图像处理什么是图像处理?Python图像处理库安装Pillow库加载和显示图像调整图像大小裁剪图像调整图像亮度、对比度和色彩平衡应用滤镜练习题Python图像处理 什么是图像处理? 图像处理是指使用计算机算法来改变图像的外观或特征。它可以用于许多不同的应用程序…...
Stable Diffusion - 扩展 Roop 换脸 (Face Swapping) 插件的配置与使用
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131856141 官网:GitHub - roop,参考论文:RobustSwap: A Simple yet Robust Face Swapping Model against Attr…...
opencv实现替换证件照颜色
程序可以实现蓝色底片变为红色底片(但有点小bug) 修改自:opencv:HSV颜色模型_opencv hsv_君浪的博客-CSDN博客 相关文章:OpenCV Mat数据类型指针ptr的使用_cv::mat ptr_AoboSir的博客-CSDN博客 【OpenCV】HSV颜色识…...
Elasticsearch【全文检索、倒排索引、应用场景、对比Solr、数据结构】(一)-全面详解(学习总结---从入门到深化)
目录 Elasticsearch介绍_全文检索 Elasticsearch介绍_倒排索引 Elasticsearch介绍_Elasticsearch的出现 Elasticsearch介绍_Elasticsearch应用场景 Elasticsearch介绍_Elasticsearch对比Solr Elasticsearch介绍_Elasticsearch数据结构 Elasticsearch介绍_全文检索 Elasti…...
了解 3DS MAX 3D摄像机跟踪设置:第 2 部分
推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 项目设置 步骤 1 打开“后效”。 打开后效果 步骤 2 转到合成>新合成以创建新合成。 将“宽度”和“高度”值分别设置为 1280 和 720。将帧速率设置为 25,将持续时间设置为 12 秒。单…...
MySQL 判断 JSON 数组是否相等
文章目录 1.问题2.使用 JSON_CONTAINS 与 JSON_LENGTH参考文献 1.问题 JSON(JavaScript Object Notation)是流行的互联网应用服务之间的数据交换格式。 MySQL 从 5.7 版本开始支持 RFC 7159 定义的 JSON 规范,主要有 JSON 对象 和 JSON 数组…...
uni-app个人中心
一. 介绍uni-app: uni-app 是基于Vue.js框架开发的一个跨平台移动应用开发框架,可以同时支持多个平台(如iOS、Android、Web等)的应用开发。采用了统一的语法和组件规范,可以大大简化跨平台开发的工作,提高…...
Kook Zimage真实幻想Turbo部署教程:免conda环境纯pip安装方案
Kook Zimage真实幻想Turbo部署教程:免conda环境纯pip安装方案 1. 项目简介 Kook Zimage真实幻想Turbo是一款专为个人GPU设计的轻量化幻想风格文生图系统。它基于Z-Image-Turbo官方极速文生图底座,通过特殊技术融合了专属的幻想风格模型权重,…...
常见开源软件协议介绍
在当今数字化时代,开源软件如同一股洪流,席卷了整个技术领域。从我们日常使用的操作系统,到复杂的大数据处理框架,开源软件无处不在。然而,在这繁荣的开源生态背后,有一群默默守护规则的 “卫士”ÿ…...
大厂面试必问:Nacos 灵魂 18 问,这篇文章帮你彻底搞定!
从基础概念到CAP原理,从心跳机制到集群部署,一篇搞定Nacos面试在微服务架构大行其道的今天,Nacos 作为阿里巴巴开源的动态服务发现、配置和服务管理平台,已经成为面试中的必考知识点。无论你是刚入行的初级工程师,还是…...
OpenClaw常见错误排查:nanobot连接问题解决方案
OpenClaw常见错误排查:nanobot连接问题解决方案 1. 问题背景与排查思路 上周我在本地部署OpenClaw对接nanobot镜像时,遇到了几个典型的连接问题。作为一个开源自动化框架,OpenClaw在实际使用中经常会遇到各种"水土不服"的情况。特…...
【毕业设计】SpringBoot+Vue+MySQL 兴顺物流管理系统平台源码+数据库+论文+部署文档
摘要 随着电子商务和全球贸易的快速发展,物流行业在现代经济体系中的重要性日益凸显。高效、智能的物流管理系统能够显著提升企业的运营效率,降低管理成本,并优化客户体验。然而,传统的物流管理方式仍存在信息孤岛、数据冗余、流程…...
Flutter控制麦克风的方法
Flutter本身不直接提供麦克风控制的原生API,需借助第三方插件实现,核心围绕「权限申请」「麦克风开启/关闭」「音频采样/录音」「资源释放」四大场景。以下是最常用、兼容性最强的实现方案,覆盖多平台适配,附完整代码示例。 一、核…...
工业自动化实战:如何用IEEE 802.1AS实现微秒级时间同步(附Linux配置)
工业自动化实战:如何用IEEE 802.1AS实现微秒级时间同步(附Linux配置) 在工业4.0和智能制造浪潮下,毫秒级时间同步已无法满足高端装备协同控制的需求。某汽车生产线曾因500微秒的时间偏差导致机械臂碰撞,直接造成数百万…...
《一文学会管理:提示工程架构师提示内容更新的核心技巧》
一文学会管理:提示工程架构师提示内容更新的核心技巧 摘要 当你花费数周打磨的AI提示上线后,是否遇到过这样的场景: 用户反馈“AI回答越来越不准确”;业务方要求“增加新的功能模块”;模型升级后,原来的提示…...
3步获取macOS完整安装包:Download Full Installer工具的终极指南
3步获取macOS完整安装包:Download Full Installer工具的终极指南 【免费下载链接】DownloadFullInstaller macOS application written in SwiftUI that downloads installer pkgs for the Install macOS Big Sur application. 项目地址: https://gitcode.com/gh_m…...
5步搞定Jimeng LoRA部署:轻量文生图测试系统快速上手
5步搞定Jimeng LoRA部署:轻量文生图测试系统快速上手 1. 项目概述与核心优势 Jimeng LoRA是一款专为LoRA模型测试优化的轻量化文本生成图像系统。基于Z-Image-Turbo底座构建,它实现了单次底座加载、动态LoRA热切换的创新功能,大幅提升了模型…...
