设计模式-责任链-笔记
动机(Motivation)
在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有个接受者,如果显示指定,将必不可少地带来请求者与接受者的紧耦合。
如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行是决定来处理请求,从而两者解耦。
模式定义:
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个请求处理他为止。
#include <iostream>
#include <string>using namespace std;enum class RequestType {REQ_HANDLER1,REQ_HANDLER2,REQ_HANDLER3,
};class Request {string description;RequestType reqType;
public:Request(const string& desc, RequestType type) : description(desc), reqType(type) {}RequestType getReqType() const { return reqType; }const string& getDescription() const { return description; }
};class ChainHandler {ChainHandler* nextChain;void sendRequestToNextHandler(const Request& req) {if (nullptr != nextChain) {nextChain->handle(req);}}
protected:virtual bool canHandleRequest(const Request& req) = 0;virtual void processRequest(const Request& req) = 0;
public:ChainHandler() { nextChain = nullptr; }void setNextChain(ChainHandler* next) { nextChain = next; }void handle(const Request& req) {if (canHandleRequest(req)) {processRequest(req);}else{sendRequestToNextHandler(req);}}
};class Handler1 : public ChainHandler {
protected:virtual bool canHandleRequest(const Request& req) override {return req.getReqType() == RequestType::REQ_HANDLER1;}virtual void processRequest(const Request& req) override {cout << "Handler1 is handle request: " << req.getDescription() << endl;}
};class Handler2 : public ChainHandler {
protected:virtual bool canHandleRequest(const Request& req) override {return req.getReqType() == RequestType::REQ_HANDLER2;}virtual void processRequest(const Request& req) override {cout << "Handler2 is handle request: " << req.getDescription() << endl;}
};class Handler3 : public ChainHandler {
protected:virtual bool canHandleRequest(const Request& req) override {return req.getReqType() == RequestType::REQ_HANDLER3;}virtual void processRequest(const Request& req) override {cout << "Handler3 is handle request: " << req.getDescription() << endl;}
};int main() {Handler1 h1;Handler1 h2;Handler1 h3;h1.setNextChain(&h2);h2.setNextChain(&h3);Request req("process task ...", RequestType::REQ_HANDLER3);h1.handle(req);return 0;
}
要点总结:
Chain of Responsibility模式的应用场合在于“一个请求可能有多个接受者,但是最后真正的接受者只有一个“,这时候请求发送者与接受者的耦合有可能出现”变化脆弱“的症状,指责链的目的就是将两者解耦,从而更好地应对变化。
应用了Chain of Responsibility模式后,对象的职责分派将更具灵活性。我们可以在运行时动态增加/修改请求的处理职责。
如果请求传递到职责链的末尾乃得不到处理,应该有一个合理的缺省机制。这也使每一个接受对象的职责,而不是发出请求的对象的职责。
相关文章:
设计模式-责任链-笔记
动机(Motivation) 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有个接受者,如果显示指定,将必不可少地带来请求者与接受者的紧耦合。 如何使请求的发送者不需要指定具体的接受…...
SpringMvc请求原理流程
springmvc是用户和服务沟通的桥梁,官网提供了springmvc的全面使用和解释:DispatcherServlet :: Spring Framework 流程 1.Tomcat启动 2.解析web.xml文件,根据servlet-class找到DispatcherServlet,根据init-param来获取spring的…...
【开源】基于Vue.js的音乐偏好度推荐系统的设计和实现
项目编号: S 012 ,文末获取源码。 \color{red}{项目编号:S012,文末获取源码。} 项目编号:S012,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 音乐档案模块2.1…...
采集1688整店商品(店铺所有商品、店铺列表api)
返回数据: 请求链接 {"user": [],"items": {"item": [{"num_iid": "738354436678","title": "国产正品i13 promax全网通5G安卓智能手机源头厂家批发手机","pic_url": "http…...
IObit Unlocker丨解除占用程序软件
更多内容请收藏:https://rwx.tza-3.xyz 官网:IObit Unlocker “永远不用担心电脑上无法删除的文件。” 界面简单,支持简体中文,一看就会,只需要把无法删除/移动的文件或整个U盘拖到框里就行。 解锁率很高,…...
开发一款小程序游戏需要多少钱?
小程序游戏的开发成本因多种因素而异,无法提供具体的固定数字。以下是影响小程序游戏开发成本的一些关键因素: 游戏规模和复杂度: 小程序游戏可以是简单的休闲游戏,也可以是更复杂的策略游戏。规模和复杂度会影响开发所需的时间和…...
基于Vue+SpringBoot的校园电商物流云平台开源项目
项目编号: S 034 ,文末获取源码。 \color{red}{项目编号:S034,文末获取源码。} 项目编号:S034,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 商品数据模块2.3 快…...
庖丁解牛:NIO核心概念与机制详解 03 _ 缓冲区分配、包装和分片
文章目录 Pre概述缓冲区分配和包装 (allocate 、 wrap)缓冲区分片 (slice)缓冲区份片和数据共享只读缓冲区 (asReadOnlyBuffer)直接和间接缓冲区 (allocateDirect)内存映射文件 I/O将文件映射到内存(map) Pre 庖丁解牛࿱…...
002 OpenCV dft 傅里叶变换
目录 一、傅里叶变换 1.1 傅里叶变换概念 1.2 opencv中傅里叶变换 二、实验代码 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、傅里叶变换 2.1 傅里叶变换概念 傅里叶变换(Fourier Transform)是一种…...
力扣:171. Excel 表列序号(Python3)
题目: 给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 来源:力扣(LeetCode) …...
C++中结构体的初始化
C中结构体的初始化 结构体是一个由程序员定义的数据类型,可以容纳许多不同的数据值。在过去,面向对象编程的应用尚未普及之前,程序员通常使用这些从逻辑上连接在一起的数据组合到一个单元中。一旦结构体类型被声明并且其数据成员被标识&…...
vue3+vite+ts 发布自定义组件到npm
vue3vite 发布自定义组件到npm 初始化项目编写组件配置打包组件上传到npm测试组件库 初始化项目 // 创建项目 pnpm create vite vue-test-app --template vue-ts// 运行项目 cd vite vue-test-app pnpm install pnpm run dev编写组件 1、根目录下创建packages目录作为组件的开…...
mybatis使用xml形式配置
以这个注解形式的查询代码为例 Select("select * from emp where name like concat(%,#{name},%) and gender #{gender} and entrydate between #{begin} and #{end} order by update_time desc ")public List<Emp> list(String name, Short gender, LocalDat…...
开源简历生成器OpenResume
什么是 OpenResume ? OpenResume 是一个功能强大的开源简历生成器和简历解析器。OpenResume 的目标是为每个人提供免费的现代专业简历设计,让任何人都能充满信心地申请工作。 OpenResume 有 5 个核心特点: 特征描述1. 实时UI更新当您输入简历…...
AI变现之Gpts搞流量+赚钱
文章目录 Gpts | 搞流量 + 赚钱1.项目介绍2.项目分析3.项目实操4.变现路径Gpts | 搞流量 + 赚钱 1.项目介绍 这两天 AI 圈最火的莫过于 OpenAI 开发者大会公布的一个爆炸产品 Gpts 了,大家都知道这个肯定是一个划时代的产品,也绝对是一个风口,虽然官方还没有公布到底怎么通…...
音视频项目—基于FFmpeg和SDL的音视频播放器解析(十六)
介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…...
Elasticsearch文档操作
一、Elasticsearch的CURD 1、CURD之Create PUT lqz/doc/1 {"name":"顾老二","age":30,"from": "gu","desc": "皮肤黑、武器长、性格直","tags": ["黑", "长", "直…...
聊一聊go的单元测试(goconvey、gomonkey、gomock)
文章目录 概要一、测试框架1.1、testing1.2、stretchr/testify1.3、smartystreets/goconvey1.4、cweill/gotests 二、打桩和mock2.1、打桩2.2、mock2.2.1、mockgen2.2.1、示例 三、基准测试和模糊测试3.1、基准测试3.2、模糊测试 四、总结4.1、小结4.2、其他4.3、参考资料 概要…...
Positive Technologies 利用 PT Cloud Application Firewall 保护中小型企业的网络资源
云产品按月订购,无需购买硬件资源 PT Cloud Application Firewall 是 Positive Technologies 推出的首个用于保护网络应用程序的商用云产品。Web 应用层防火墙 (web application firewall, WAF) 现在可以通过 技术合作伙伴——授权服务商和云提供商以订购方式提供1…...
深入解析序列模型:全面阐释 RNN、LSTM 与 Seq2Seq 的秘密
探索序列建模的基础知识和应用。 简介 序列建模是许多领域的一个重要问题,包括自然语言处理 (NLP)、语音识别和语音合成、时间序列预测、音乐生成和「生物信息学」。所有这些任务的共同点是它们需要坚持。接下来的事情的预测是基于历史的。例如,在“哈桑…...
Adobe软件非正版弹窗终极解决方案:PS/Ai/PR/AE禁用提示一键清除指南
1. Adobe弹窗问题的根源分析 最近不少朋友打开Photoshop、Illustrator这些Adobe软件时,突然跳出一个烦人的提示框:"Your non-genuine Adobe app will be disabled soon"。这个警告不仅影响使用体验,严重时还会导致软件直接罢工。作…...
2026年华为云OpenClaw如何安装?配置百炼API零门槛10分钟步骤
2026年华为云OpenClaw如何安装?配置百炼API零门槛10分钟步骤。OpenClaw(曾用名Clawdbot)是一款轻量化、可扩展的开源AI智能体执行框架,支持自然语言指令驱动、多模型灵活切换与全场景任务自动化。对于新手而言,阿里云轻…...
Windows下WVP+ZLMediaKit联动实战:5分钟搞定GB28181摄像头接入(附端口避坑清单)
Windows下WVPZLMediaKit联动实战:5分钟搞定GB28181摄像头接入(附端口避坑清单) 在智能视频监控领域,GB28181协议作为国家标准协议,正在成为设备互联的主流选择。但对于刚接触这一领域的开发者来说,从零开始…...
矿井排水系统直接关系到煤矿安全生产,今天咱们掰开揉碎了聊聊西门子S7-200 PLC控制三台水泵的实战经验。老规矩,先上干货再说原理
基于西门子PLC的煤矿排水系统控制,内容包括 [1]S7-200 PLC程序[2]MCGS6.2组态画面[3]电气图纸精品文档 共有3台水泵进行矿井排水,分别为1号水泵,2号水泵,3号水泵 其中1号,2号水泵是工作水泵,3号水泵是备用水…...
实时口罩检测-通用镜像效果展示:绿色框已戴,红色框未戴,一目了然
实时口罩检测-通用镜像效果展示:绿色框已戴,红色框未戴,一目了然 1. 开箱即用的口罩检测方案 在公共场所管理中,快速识别人员是否佩戴口罩一直是个实际需求。传统方法要么需要专业设备,要么准确率不高。今天要介绍的…...
多模态Agent架构实战落地:从需求分析到生产部署
多模态Agent架构实战落地:从需求分析到生产部署 随着大语言模型技术的普及,单一文本交互的智能系统已无法满足复杂业务场景需求——电商平台需要同时理解用户的商品描述文本、实拍图片和售后语音诉求,教育场景需要处理手写作业、视频讲解和文…...
YOLOv8模型在RKNN平台上的实战部署指南(附完整代码)
YOLOv8模型在RKNN平台上的实战部署指南(附完整代码) 在嵌入式设备上部署高性能目标检测模型一直是计算机视觉领域的难点。瑞芯微(Rockchip)推出的RKNN推理框架为这一挑战提供了解决方案,尤其适合需要低功耗、高效率的边…...
突破三维建模效率瓶颈:Blender对齐工具重新定义精准操作流程
突破三维建模效率瓶颈:Blender对齐工具重新定义精准操作流程 【免费下载链接】quicksnap Blender addon to quickly snap objects/vertices/points to object origins/vertices/points 项目地址: https://gitcode.com/gh_mirrors/qu/quicksnap 在复杂的三维建…...
保姆级万物识别教程:阿里开源镜像快速部署,识别图片超简单
保姆级万物识别教程:阿里开源镜像快速部署,识别图片超简单 1. 开篇:为什么选择这个镜像? 今天给大家介绍一个特别实用的AI工具——阿里开源的"万物识别-中文-通用领域"镜像。这个镜像最大的特点就是简单易用ÿ…...
Ostrakon-VL终端入门指南:如何导出结构化JSON结果用于BI工具接入
Ostrakon-VL终端入门指南:如何导出结构化JSON结果用于BI工具接入 1. 认识Ostrakon-VL终端 Ostrakon-VL终端是一款专为零售与餐饮行业设计的智能图像识别工具,它将复杂的AI技术包装成一个充满游戏感的像素风格界面。这个终端基于Ostrakon-VL-8B多模态大…...
