当前位置: 首页 > article >正文

23种设计模式 - 责任链

模式定义

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,允许多个对象按链式顺序处理请求,直到其中一个对象处理为止。该模式将请求的发送者和接收者解耦,使多个对象都有机会处理请求。


模式结构

抽象处理者(Handler)

  • 定义处理请求的接口(如 handleRequest()
  • 持有下一个处理者的引用(nextHandler
    具体处理者(ConcreteHandler)
  • 实现请求处理逻辑,决定是否处理或传递请求
    客户端(Client)
  • 构建处理链并触发请求

适用场景

多级处理逻辑:数控系统中需要依次执行安全检查、参数校验、运动控制等步骤
动态调整处理流程:运行时灵活调整处理链顺序(如紧急任务跳过某些校验)
解耦请求与处理者:避免请求发送者依赖具体处理对象


C++示例(数控系统场景)

场景说明:
数控系统执行加工任务时需依次通过安全检查、参数校验、运动控制三个环节,任一环节失败则终止流程。

#include 
#include // 请求类:加工任务
class MachiningRequest {
public:MachiningRequest(int speed, float depth) : speed_(speed), depth_(depth), isSafe_(false), isValid_(false) {}int speed_;float depth_;bool isSafe_;bool isValid_;
};// 抽象处理者
class Handler {
protected:Handler* nextHandler_;
public:Handler() : nextHandler_(nullptr) {}virtual ~Handler() = default;void setNext(Handler* handler) { nextHandler_ = handler; }virtual void handleRequest(MachiningRequest& request) = 0;
};// 具体处理者:安全检查
class SafetyCheckHandler : public Handler {
public:void handleRequest(MachiningRequest& request) override {if (request.speed_ <= 5000 && request.depth_ <= 100.0f) {request.isSafe_ = true;std::cout << "安全检查通过" << std::endl;if (nextHandler_) nextHandler_->handleRequest(request);} else {std::cout << "安全校验失败:参数超限" << std::endl;}}
};// 具体处理者:参数校验
class ParameterValidator : public Handler {
public:void handleRequest(MachiningRequest& request) override {if (request.speed_ > 0 && request.depth_ > 0) {request.isValid_ = true;std::cout << "参数校验通过" << std::endl;if (nextHandler_) nextHandler_->handleRequest(request);} else {std::cout << "参数校验失败:非法数值" << std::endl;}}
};// 具体处理者:运动控制
class MotionController : public Handler {
public:void handleRequest(MachiningRequest& request) override {if (request.isSafe_ && request.isValid_) {std::cout << "运动控制执行:速度=" << request.speed_ << "rpm,深度=" << request.depth_ << "mm" << std::endl;}}
};int main() {// 构建处理链Handler* safetyCheck = new SafetyCheckHandler();Handler* validator = new ParameterValidator();Handler* motionCtrl = new MotionController();safetyCheck->setNext(validator);validator->setNext(motionCtrl);// 触发请求MachiningRequest task1(2500, 50.0f);std::cout << "--- 任务1执行 ---" << std::endl;safetyCheck->handleRequest(task1);MachiningRequest task2(6000, 150.0f);std::cout << "\n--- 任务2执行 ---" << std::endl;safetyCheck->handleRequest(task2);delete safetyCheck;delete validator;delete motionCtrl;return 0;
}

输出结果

--- 任务1执行 ---
安全检查通过
参数校验通过
运动控制执行:速度=2500rpm,深度=50mm--- 任务2执行 ---
安全校验失败:参数超限

实现要点

链式传递:每个处理者通过 nextHandler_ 传递请求,形成处理链[
动态扩展:新增处理步骤(如日志记录)只需添加新 ConcreteHandler
终止条件:处理者根据业务逻辑决定是否中断链(如安全检查失败)


模式变体

纯责任链:请求必须被严格处理或传递(如审批流程)
带中断的链:处理完成后可终止传递(如本示例的安全检查)
优先级链:按优先级动态排序处理者(如紧急任务优先处理)

相关文章:

23种设计模式 - 责任链

模式定义 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;允许多个对象按链式顺序处理请求&#xff0c;直到其中一个对象处理为止。该模式将请求的发送者和接收者解耦&#xff0c;使多个对象都有机会处理请求。 模式结构…...

【Linux-命令】

Linux-命令 ■ ls■ cd■ pwd■ tree■ mkdir■ rm■ mv■ cp■ chmod■ chattr 文件的特殊属性■ cat■ 日期■ 关机■ find■ 查看文件内容■ cat■ ln■ mount 挂载一个文件系统■ uname■ 用户和组■ 打包和压缩■ zip■ gzip■ rar■ tar ■ 包■ rpm 包■ yum 软件包升级…...

豪越科技:消防安全重点单位一体化安全管控

在当今数字化高速发展的时代&#xff0c;消防安全的重要性日益凸显。豪越科技以其卓越的技术实力和创新精神&#xff0c;将物联网、大数据、人工智能等先进技术深度融合&#xff0c;打造出了功能强大的消防安全重点单位一体化安全管控平台&#xff0c;为消防安全管理带来了全新…...

LabVIEW无刷电机控制器检测系统

开发了一种基于LabVIEW的无刷电机控制器检测系统。由于无刷电机具有高效率、低能耗等优点&#xff0c;在电动领域有取代传统电机的趋势&#xff0c;而无刷电机的核心部件无刷电机控制器产量也在不断增长。然而&#xff0c;无刷电机控制器的出厂检测仍处于半自动化状态&#xff…...

EXCEL解决IF函数“您已为此函数输入太多个参数”的报错

IF函数的基本结构是IF(条件, 值为真时的结果, 值为假时的结果)&#xff0c;所以标准的IF函数最多只能有三个参数。当用户输入的参数超过三个时&#xff0c;Excel就会报这个错误。比如多个IF语句叠加&#xff0c;但可能在嵌套的过程中没有正确关闭每个IF函数的括号&#xff0c;导…...

C#使用文件读写操作实现仙剑五前传称号存档修改

手把手教学仙剑五前传 称号存档修改器 首先找到 Pal5Q所在目录的save\global.sav 文件,这是一个只有488字节的文件,这里存放称号对应的编号ID,以及是否已获得该称号,1为已获取称号,0为未获取称号 [称号:是否获取]这是一个键值对 称号的编号ID是一个Int32数字,使用C#的方法Bi…...

Python 发布 Web 应用的常见方法及详细步骤

以下是 Python 发布 Web 应用的常见方法及详细步骤&#xff0c;涵盖从本地开发到生产环境部署的全流程&#xff1a; 一、基础准备&#xff1a;开发 Web 应用 1. 选择框架&#xff08;以 Flask 为例&#xff09; # app.py from flask import Flask app Flask(__name__)app.ro…...

记录一次部署PC端网址全过程

当我查看我之前写的文章时、顿时惊奇发出感慨&#xff1a;啥时候写的&#xff1f;是我写的么&#xff1f;疑惑重重… 所以说&#xff0c;好记性不如烂笔头。 记录一次部署PC端网址全过程 部署PC端网址分是三步&#xff1a;第一步&#xff1a;申请域名并映射到外网IP &#xff0…...

Spring——Spring开发实战经验(4)

摘要 本文深入探讨了 Spring 应用中 Interceptor&#xff08;拦截器&#xff09;、Filter&#xff08;过滤器&#xff09;和 Aspect&#xff08;切面&#xff09;的执行顺序、职责及典型使用场景。Filter 是 Servlet 级别的机制&#xff0c;主要用于日志记录、权限验证等&…...

深入探索HarmonyOS——构建万物智联的新时代

作者&#xff1a;林钟雪 引言 在科技日新月异的今天&#xff0c;操作系统作为连接硬件与软件的核心桥梁&#xff0c;正引领着数字化转型的新浪潮。HarmonyOS&#xff0c;作为华为自主研发的面向万物智联时代的分布式全场景操作系统&#xff0c;自发布以来便备受瞩目。它不仅打…...

算法12-贪心算法

一、贪心算法概念 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下最优的选择&#xff0c;从而希望导致全局最优解的算法。贪心算法的核心思想是“局部最优&#xff0c;全局最优”&#xff0c;即通过一系列局部最优选择&#xff0c;最…...

小白win10安装并配置yt-dlp

需要yt-dlp和ffmpeg 注意存放路径最好都是全英文 win10安装并配置yt-dlp 一、下载1.下载yt-dlp2. fffmpeg下载 二、配置环境三、cmd操作四、yt-dlp下视频操作 一、下载 1.下载yt-dlp yt-dlp地址 找到win的压缩包点下载&#xff0c;并解压 2. fffmpeg下载 ffmpeg官方下载 …...

I²C简介

前言 IC&#xff08;Inter-Integrated Circuit, 内置集成电路&#xff09;总线是由Philips公司&#xff08;现属于恩智浦&#xff09;在上世纪80年代开发的两线式串行通信总线&#xff0c;用于连接微控制器及其外围设备&#xff0c;控制设备之间的通信。 IC总线的物理拓扑示意…...

Spring容器扩展点

Spring容器扩展点 BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessorImportSelectorImportBeanDefinitionRegistorBeanPostProcessorInstantiationAwareBeanPostProcessor--postProcessBeforeInstantiationSmartInstantiationAwareBeanPostProcessor--determineCan…...

spring boot知识点3

1.spring boot能否使用xml配置 可以&#xff0c;但是很繁琐&#xff0c;现在都建议走JavaConfig 2.spring boot的核心配置文件 application.properties application.yml 3.bootstrap.properties和application.properties的区别 b&#xff1a;用于远程配置 a&#xff1a;…...

Linux后台启动命令nohup并且MobaXterm后台启动断网也不关闭软件

nohup主要作用就是可以在后台运行&#xff0c;并可以选择将日志输出到指定文件。如启动一个程序&#xff0c;若使用./demo的方式启动程序当窗口关闭的时候程序也停止了&#xff0c;而且日志会直接输出到控制台非常不直观&#xff0c;nohup启动就可以解决这两个问题。 nohup与&…...

C++(23):unreachable

C++23在头文件 "><utility>定义了std::unreachable(),用于指示编译器,该段代码不应该被允许,因此编译器可以对该位置进行优化,如果一旦允许了该位置的代码,行为未定义: #include <utility> #include <iostream>using namespace std;int func(…...

【Vue+python】Vue调用python-fastApi接口实现数据(数值、列表类型数据)渲染

前言&#xff1a;之前做的一直都是SpringBootVue的应用&#xff0c;但现在需要实现一个能将python实现的算法应用展示在前端的界面。想法是直接Vue调用python-fastApi接口实现数据渲染~ 文章目录 1. 变量定义2. axios调用python3. 跨域问题解决4. 数据渲染4.1 数值数据渲染4.2 …...

构建高效智能对话前端:基于Ant Design X 的deepseek对话应用

文章目录 实现的效果前言Ant Design X添加欢迎组件创建对话气泡存储对话历史渲染对话气泡 输入组件WebSocket 连接总结 实现的效果 待机页面&#xff1a; 等待页面&#xff1a; 完成页面&#xff1a; 前言 随着人工智能技术的飞速发展&#xff0c;大模型对话系统已成为…...

四元数如何用于 3D 旋转(代替欧拉角和旋转矩阵)【ESP32指向鼠标】

四元数如何用于 3D 旋转&#xff08;代替欧拉角和旋转矩阵&#xff09; 在三维空间中&#xff0c;物体的旋转可以用 欧拉角、旋转矩阵 或 四元数 来表示。 四元数相比于欧拉角和旋转矩阵有 计算更高效、避免万向锁、存储占用少 等优点&#xff0c;因此广泛用于 游戏开发、机器…...

Cloud: aws:network: limit 含有pps这种限制

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshooting-ena.html#statistics-ena 这个是调查网络问题的一个网页; 在里面,竟然含有pps这种限制:ethtool -S;其实是比较苛刻的安全相关的策略? [ec2-user ~]$ ethtool -S ethN NIC statistics:tx_timeout: …...

Python MoviePy 视频处理全攻略:从入门到实战案例

第1章 环境安装与配置 # 案例1&#xff1a;安装MoviePy及FFmpeg !pip install moviepy # Windows安装FFmpeg&#xff1a;https://ffmpeg.org/download.html # Linux: sudo apt-get install ffmpeg# 验证安装 from moviepy.editor import * print("MoviePy版本:", __…...

数据结构之BST、AVL、红黑树、哈夫曼树与B族树

数据结构之BST、AVL、红黑树、哈夫曼树与B族树 数据结构之BST、AVL、红黑树、哈夫曼树与B族树一、二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;1. 什么是二叉搜索树&#xff1f;重要性质 2. 二叉搜索树实现1. 节点结构定义2. 核心操作接口3. 插入算法实现4. 删除…...

开源多商户商城源码最新版_适配微信小程序+H5+APP+PC多端

在数字化时代&#xff0c;电子商务已经成为各行业不可或缺的一部分&#xff0c;开源多商户商城源码为中小企业和个人开发者提供了快速搭建和定制电商平台的利器。分享一款最新版的开源多商户商城源码&#xff0c;它能够适配微信小程序、H5、APP和PC等多个端口&#xff0c;满足商…...

第3章 .NETCore核心基础组件:3.1 .NET Core依赖注入

3.1.1 什么是控制反转、依赖注入 杨老师在书中进行了一系列的文字阐述&#xff0c;总结一下就是&#xff1a;软件设计模式中有一种叫做【控制反转】的设计模式&#xff0c;而依赖注入是实现这种设计模式的一个很重要的方式。也就是说学习依赖注入&#xff0c;是学习怎样实现控…...

cesium基础设置

cesium官网下载&#xff1a;https://cesium.com/downloads/ 1.安装cesium 选择下载到本地使用&#xff0c;或者通过npm下载到项目中 2.代码书写 &#xff08;1&#xff09;创建容器 <div id"cesiumContainer" style"width: 100%; height: 100%"><…...

Spring-GPT智谱清言AI项目(附源码)

一、项目介绍 本项目是Spring AI第三方调用整合智谱请言&#xff08;官网是&#xff1a;https://open.bigmodel.cn&#xff09;的案例&#xff0c;回答响应流式输出显示&#xff0c;这里使用的是免费模型&#xff0c;需要其他模型可以去 https://www.bigmodel.cn/pricing 切换…...

文件夹上传到github分支最后github上面还是没有文件和文件夹

环境&#xff1a; github 问题描述&#xff1a; 文件夹上传到github分支最后github上面还是没有文件和文件夹, 和这样一样 解决方案&#xff1a; 从 git ls-tree -r HEAD 的输出中可以看到&#xff0c;metahuman-stream 文件夹显示为如下内容&#xff1a; 160000 commi…...

面试题之箭头函数和普通函数有什么区别?

箭头函数&#xff08;Arrow Function&#xff09;和普通函数&#xff08;Regular Function&#xff09;是 JavaScript 中两种不同的函数定义方式&#xff0c;它们在语法、上下文&#xff08;this&#xff09;、原型链等方面存在显著区别。以下是它们的主要区别&#xff1a; 1. …...

【文献精读】AAAI24:FacetCRS:打破对话推荐系统中的“信息茧房”

标题FacetCRS: Multi-Faceted Preference Learning for Pricking Filter Bubbles in Conversational Recommender System期刊The Thirty-Eighth AAAI Conference on Artificial Intelligence (AAAI-24)年份2024关键词Conversational Recommender System (CRS), Filter Bubbles,…...