【设计模式】【行为型模式】【责任链模式】
系列文章目录
可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm=1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm=1001.2014.3001.5501
目录
系列文章目录
1 简介
1.1 基本概念
1.2 组成结构
1.3 优点和缺点
2.代码案例
2.1 主要步骤
2.2 代码
1 简介
1.1 基本概念
责任链模式是一种行为型设计模式,它允许你构建一个对象链,让请求从链的一端进入,然后依次沿着链传递处理,直到链上的某个对象能够处理该请求。职责链上的每一个处理者都是一个对象,其内部会包含mNext指向下一个对象,这个对象可以对请求进行处理也可以将请求发送给下一个对象去处理。

1.2 组成结构

1.客户端类:首先其需要创建并组装处理者对象链,即客户端需要通过SetNextHandler函数,将其mNext指向下一个处理者,然后形成一个链表,当客户端发送请求的时候,只需要调用第一个处理者的处理函数即可。
2.抽象的处理者Handler类:这是一个抽象类,主要提供两个接口,第一一个接口是SetNextHandler函数,用于指向下一个处理者,第二个接口是hanlerRequset函数,用于让子类去重写其实现。
2.具体的处理者,Handler类的子类,需要重写hanlerRequset函数。
1.3 优点和缺点
优点:
1.降低耦合度,将请求的发送者和处理者解耦,每个具体的处理者只处理和自己相关的请求,客户端无需知道谁来处理。
2.可扩展性,新增加处理者,也无须修改原有的代码。只继续放在链表中即可。
3.灵活性,可以动态的改变处理者之间的顺序,新增和删除处理者,很方便。
缺点:
1.当链表上的处理者比较多的时候,请求可能需要遍历所有的处理者,可能会存在性能问题。
2.链表建立不当可能草成循环调用,即进入死循环。
3.不一定被处理,如果中间写错,则很可能请求无法到末端。
2.代码案例
2.1 主要步骤
第一步:构建抽象的处理者类(Handler)
第二步:构建多个具体的处理者类,并重写hanlerRequset函数,处理自己类的需求。
第三步:构建链表。
第四步:调用链表头部的hanlerRequset函数。
第三步:
2.2 代码
class Handler //抽象处理类父类
{
public:Handler(std::shared_ptr<Handler> NextHandler){setNextHandler(NextHandler);}void setNextHandler(const std::shared_ptr<Handler> NextHandler)//设置当前处理者的下一个处理者{mNextHandler = NextHandler;}virtual int hanlerRequset(int day) = 0; //纯虚函数,子类需要具体的实现std::shared_ptr<Handler> mNextHandler = nullptr;//指向下一个处理者类
};
0
class GroupLeaderHandler : public Handler //第一个处理者(组长)
{
public:GroupLeaderHandler(std::shared_ptr<Handler> NextHandler) : Handler(NextHandler){}int hanlerRequset(int day){if (day < 0){cout << "day is error" << endl;return -1;}else if (day <= 3 && day >= 0){cout << "GroupLeaderHandler hanlerRequset success" << endl;return 0;}else{if (mNextHandler){return mNextHandler->hanlerRequset(day);}else{return -1;}}}
};class ManagerHandler : public Handler//第二个处理者(经理)
{
public:ManagerHandler(std::shared_ptr<Handler> NextHandler) : Handler(NextHandler){}int hanlerRequset(int day){if (day < 0){cout << "day is error" << endl;return -1;}else if (day <= 7 && day >= 4){cout << "ManagerHandler hanlerRequset success" << endl;return 0;}else{if (mNextHandler){return mNextHandler->hanlerRequset(day);}else{return -1;}}}
};class DirectorHandler : public Handler
{
public:DirectorHandler(std::shared_ptr<Handler> NextHandler) : Handler(NextHandler)//第三个处理者(董事长){}int hanlerRequset(int day){if (day < 0){cout << "day is error" << endl;return -1;}else if (day >= 8){cout << "DirectorHandler hanlerRequset success" << endl;return 0;}else{if (mNextHandler){return mNextHandler->hanlerRequset(day);}else{return -1;}}}
};int main()
{ auto mspDirectorHandler = make_shared<DirectorHandler>(nullptr);auto mspManagerHandler = make_shared<ManagerHandler>(mspDirectorHandler);auto mspGroupLeaderHandler = make_shared<GroupLeaderHandler>(mspManagerHandler);//构建链表mspGroupLeaderHandler->hanlerRequset(3);//调用统一接口去处理mspGroupLeaderHandler->hanlerRequset(5);mspGroupLeaderHandler->hanlerRequset(8);return 0;
}
相关文章:
【设计模式】【行为型模式】【责任链模式】
系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录…...
超越所有SOTA达11%!媲美全监督方法 | UC伯克利开源UnSAM
文章链接:https://arxiv.org/pdf/2406.20081 github链接:https://github.com/frank-xwang/UnSAM SAM 代表了计算机视觉领域,特别是图像分割领域的重大进步。对于需要详细分析和理解复杂视觉场景(如自动驾驶、医学成像和环境监控)的应用特别有…...
享元模式(设计模式)
享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享细粒度对象来减少内存使用,从而提高性能。在享元模式中,多个对象可以共享相同的状态以减少内存消耗,特别适合用于大量相似对象的场景。 享元模…...
【机器学习】大模型训练的深入探讨——Fine-tuning技术阐述与Dify平台介绍
目录 引言 Fine-tuning技术的原理阐 预训练模型 迁移学习 模型初始化 模型微调 超参数调整 任务设计 数学模型公式 Dify平台介绍 Dify部署 创建AI 接入大模型api 选择知识库 个人主页链接:东洛的克莱斯韦克-CSDN博客 引言 Fine-tuning技术允许用户根…...
【Linux从入门到放弃】探究进程如何退出以进程等待的前因后果
🧑💻作者: 情话0.0 📝专栏:《Linux从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! 进…...
QT5 static_cast实现显示类型转换
QT5 static_cast实现显示类型转换,解决信号重载情况...
【ES】--Elasticsearch的翻页详解
目录 一、前言二、from+size浅分页1、from+size导致深度分页问题三、scroll深分页1、scroll原理2、scroll可以返回总计数量四、search_after深分页1、search_after避免深度分页问题一、前言 ES的分页常见的主要有三种方式:from+size浅分页、scroll深分页、search_after分页。…...
3.js - 纹理的重复、偏移、修改中心点、旋转
你瞅啥 上字母 // ts-nocheck // 引入three.js import * as THREE from three // 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls // 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js // 导入twee…...
RS232隔离器的使用
RS232隔离器在通信系统中扮演着至关重要的角色,其主要作用可以归纳如下: 一、保护通信设备 电气隔离:RS232隔离器通过光电隔离技术,将RS-232接口两端的设备电气完全隔离,从而避免了地线回路电压、浪涌、感应雷击、静电…...
一切为了安全丨2024中国应急(消防)品牌巡展武汉站成功召开!
消防品牌巡展武汉站 6月28日,由中国安全产业协会指导,中国安全产业协会应急创新分会、应急救援产业网联合主办,湖北消防协会协办的“一切为了安全”2024年中国应急(消防)品牌巡展-武汉站成功举办。该巡展旨在展示中国应急(消防&am…...
【面试系列】PHP 高频面试题
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…...
JAVA极简图书管理系统,初识springboot后端项目
前提条件: 具备基础的springboot 知识 Java基础 废话不多说! 创建项目 配置所需环境 将application.properties>application.yml 配置以下环境 数据库连接MySQL 自己创建的数据库名称为book_test server:port: 8080 spring:datasource:url:…...
MySQL 重新初始化实例
1、关闭mysql服务 service mysqld stop 2、清理datadir(本例中指定的是/var/lib/mysql)指定的目录下的文件,将该目录下的所有文件删除或移动至其他位置 cd /var/lib/mysql mv * /opt/mysql_back/ 3、初始化实例 /usr/local/mysql/bin/mysqld --initialize --u…...
VCS编译bug汇总
‘typedef’ is not expected to be used in this contex 注册前少了分号。 Scope resolution error resolution : 声明指针时 不能与类名同名,即 不能声明为adapter. cannot find member "type_id" 忘记注册了 拼接运算符使用 关键要加上1b࿰…...
【2024LLM应用-数据预处理】之如何从PDF,PPT等非结构化数据提取有效信息(结构化数据JSON)?
🥰大家知道吗,之前在给AI大模型"喂数据"的时候,我们往往需要把非结构化数据(比如PDF、PPT、Excel等)自己手动转成结构化的格式,这可真是太累人儿了。🥵 幸好现在有了Unstructured这个神级库,它内置的数据提取函数可以帮我们快速高效地完成这个…...
冯雷老师:618大退货事件分析
近日冯雷老师受邀为某头部电商36名高管进行培训,其中聊到了今年618退货潮的问题。以下内容整理自冯雷老师的部分授课内容。 一、引言 随着电子商务的蓬勃发展,每年的618大促已成为消费者和商家共同关注的焦点。然而,在销售额不断攀升的同时…...
JAVA基础教程DAY0-基础知识
JAVA语言的特点 简单性、面向对象、安全性、跨平台性、支持多线程、分布性 面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它通过将数据和操作这些数据的方法封装在一起,以创建对象的形式来组织代…...
鸿蒙开发Ability Kit(程序访问控制):【安全控件概述】
安全控件概述 安全控件是系统提供的一组系统实现的ArkUI组件,应用集成这类组件就可以实现在用户点击后自动授权,而无需弹窗授权。它们可以作为一种“特殊的按钮”融入应用页面,实现用户点击即许可的设计思路。 相较于动态申请权限的方式&am…...
【信息系统项目管理师】18年~23年案例概念型知识
文章目录 18上18下19上19下20上20下21上21下22年上22年下23年上 18上 请简述 ISO 9000 质量管理的原则 领导作用、 过程方法、 管理的系统方法、 与供方互利的关系、 基于事实的决策方法、 持续改进、 全员参与、 以顾客为关注焦点 概念 国家标准(GB/T 1 9000 2008)对质量的定…...
什么是字符串常量池?如何利用它来节省内存?
字符串常量池是Java中一个非常重要的概念,尤其对于理解内存管理和性能优化至关重要。想象一下,你正在管理一家大型图书馆,每天都有无数读者来借阅书籍。 如果每本书每次借阅都需要重新印刷一本,那么图书馆很快就会陷入混乱&#…...
【ElevenLabs纪录片旁白语音实战指南】:20年音视频架构师亲授5大黄金参数调优法,97%用户忽略的声场沉浸阈值!
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs纪录片旁白语音的核心价值与声学定位 ElevenLabs 的纪录片旁白语音并非仅追求“像人”,而是通过声学建模、情感韵律建模与语境感知三重机制,实现专业级叙事可信度的重…...
Go语言树结构:二叉树与AVL树
Go语言树结构:二叉树与AVL树 1. 二叉树实现 type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode }type BinaryTree struct {Root *TreeNode }func (t *BinaryTree) Insert(val int) {t.Root insert(t.Root, val) }func insert(node *TreeNode, val in…...
基于AIGC的文本生成视频系统:从架构设计到工程实践
1. 项目概述:从文本到视频的自动化创作最近在折腾一个挺有意思的项目,叫“TextCreateVideo”,直译过来就是“文本生成视频”。这玩意儿听起来像是科幻电影里的概念,但现在已经有不少开源项目在尝试落地了。我关注的这个Anning01/T…...
vue基于springboot框架的内部服务器销售信息管理平台
目录同行可拿货,招校园代理 ,本人源头供货商功能模块划分技术实现要点系统交互设计扩展功能规划项目技术支持源码获取详细视频演示 :同行可合作点击我获取源码->->进我个人主页-->获取博主联系方式同行可拿货,招校园代理 ,本人源头供货商 功能模块划分 用…...
CloakBrowser 拆机:57 个 C++ 补丁能不能撑起“30/30 通过“的承诺?
路易乔布斯 2026-05-14 AI Daily 深度拆解 数据时间锚点:本文写作时 CloakHQ/CloakBrowser 数据为 10.4k stars / wrapper v0.3.28 / Chromium 146 / 57 个 C 补丁(Linux/Win)/ 16 个 release。一、又一个 🔥 重磅,但…...
Guava Ratelimiter实现单机接口限流
废话不多说直接上代码:1.依赖:<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version></dependency>2.配置类注册bean:package com.h…...
书匠策AI:一个让你“毕业不秃头“的论文神器,到底藏了什么黑科技?
各位同学,先做个灵魂拷问:你有没有在凌晨三点对着空白的Word文档,大脑一片空白,感觉自己不是在写论文,而是在跟一堵墙对视? 别慌,今天给你们安利一个我最近挖掘到的"论文外挂"——书…...
BilibiliDown:5步轻松下载B站视频和音频的终极指南
BilibiliDown:5步轻松下载B站视频和音频的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/B…...
3步掌握:微信数据本地解密与恢复完整方案
3步掌握:微信数据本地解密与恢复完整方案 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 你是否曾因更换手机而丢失珍贵的微信聊天记录?或者不小心删除了重要的商务对话࿱…...
变附着系数AGV横摆稳定性控制【附程序】
✨ 长期致力于无人搬运车、横摆稳定性、变附着系数、路面附着系数估计、直接横摆力矩控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)自适应无迹卡…...
