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

C++设计模式之责任链设计模式

C++责任链设计模式在这里插入图片描述

什么是责任链设计模式

责任链设计模式是一种行为型设计模式,它允许多个处理请求的对象串联起来,形成一个处理请求的链。每个对象都有机会处理请求,如果该对象不能处理请求,则将请求传递给链中的下一个对象。

该模式有什么优缺点

优点

  1. 解耦:责任链设计模式将处理请求的对象和解耦,使得不同的对象可以独立地变化和扩展,而不需要修改其他对象的代码。
  2. 灵活性:责任链设计模式可以轻松地添加、删除和修改处理请求的对象,从而可以灵活地适应不同的需求。
  3. 顺序独立:责任链设计模式不依赖于请求的顺序,每个对象都有机会处理请求,不论请求的顺序如何。

缺点

  1. 可能会产生多余的传递:由于每个对象都会处理请求,因此如果请求在链中传递得太多,可能会导致性能下降。
  2. 可能会出现重复处理:如果多个对象都能够处理请求,那么请求可能会在链中被重复处理,导致不必要的开销。

如何使用

下面是一个使用C++实现责任链设计模式的例子:

#include <iostream>  
#include <vector>  // 定义处理请求的接口  
interface Handler {  virtual bool handle(std::string& request) = 0;  
};  // 实现处理请求的具体类  
class ConcreteHandler : public Handler {  
public:  bool handle(std::string& request) override {  if (request.find("hello") != std::string::npos) {  std::cout << "Handling hello request" << std::endl;  return true;  }  return false;  }  
};  class ConcreteHandler2 : public Handler {  
public:  bool handle(std::string& request) override {  if (request.find("world") != std::string::npos) {  std::cout << "Handling world request" << std::endl;  return true;  }  return false;  }  
};  class ConcreteHandler3 : public Handler {  
public:  bool handle(std::string& request) override {  if (request.find("!") != std::string::npos) {  std::cout << "Handling exclamation mark request" << std::endl;  return true;  }  return false;  }  
};  // 使用责任链设计模式的例子  
int main() {  std::vector<Handler*> handlers = { new ConcreteHandler(), new ConcreteHandler2(), new ConcreteHandler3() };  std::string request = "hello world!";  for (auto handler : handlers) {  if (handler->handle(request)) {  break;  }  }  for (auto handler : handlers) {  delete handler;  }  return 0;  
}

在上面的例子中,我们定义了一个Handler接口和三个具体的处理请求的类ConcreteHandlerConcreteHandler2ConcreteHandler3。每个类都实现了handle方法,用于判断是否能够处理请求。在main函数中,我们创建了一个包含三个处理请求的对象的责任链,并使用链来处理字符串请求。每个对象都会处理请求,直到找到能够处理请求的对象为止。

相关文章:

C++设计模式之责任链设计模式

C责任链设计模式 什么是责任链设计模式 责任链设计模式是一种行为型设计模式&#xff0c;它允许多个处理请求的对象串联起来&#xff0c;形成一个处理请求的链。每个对象都有机会处理请求&#xff0c;如果该对象不能处理请求&#xff0c;则将请求传递给链中的下一个对象。 该…...

《Java-SE-第二十三章》之单例模式

文章目录 单例模式概述饿汉模式懒汉模式单线程版懒汉单例多线程版枚举实现单例 单例模式概述 单例模式是设计模式中的一种,其作用能保证某个类在程序中只存在唯一一份实例,而不会创建多份实例。单例模式具体的实现方式, 分成 “饿汉” 和 “懒汉” 两种.。饿汉模式中的饿不并不…...

如何快速同步第三方平台数据?

全量的数据主要是针对多个系统的历史数据,大概有几千万数据,只需要初始化一次即可。 而增量的数据,是系统后续变更的数据。 这个需求其实不简单,至少有以下难点: 不能直接访问第三方数据库。 不能将历史数据导出到excel中,有泄露数据的风险。 如何快速同步历史数据? 增…...

反射(一)

动态 VS 静态语言 动态语言&#xff1a;运行时&#xff0c;可以改变其结构。 Object-C、C#、JS、PHP、Python JS 就是动态语言。 function f() {var x "var a3; var b5; alert(ab)";eval(x); }静态语言&#xff1a;运行时&#xff0c;结构不可变。 Java、C、C J…...

29.利用fminbnd 求解 最大容积问题(matlab程序)

1.简述 用于求某个给定函数的最小值点。 使用方法是&#xff1a; xfminbnd(func,x1,x2) func是函数句柄&#xff0c;然后x1和x2就是函数的区间&#xff0c;得到的结果就是使func取最小值的x值 当然也可以使用[x,fv]fminbnd(func,x1,x2)的方式&#xff0c;这个时候fv就是函数…...

express学习笔记7 - docker跟mysql篇

安装Docker和Navicat Docker 进官⽹https://docs.docker.com/get-docker/ 选择机型安装即可。 Navicat&#xff08;也可以在网上找个破解版本&#xff09; 进官⽹https://www.navicat.com/en/products/navicat-premium 安装完之后连接新建⼀个数据库连接 然后再⾥⾯新建⼀个数…...

Leetcode(一):数组、链表部分经典题目详解(JavaScript版)

数组、链表部分算法题 一、数组1. 二分查找2. 移除数组元素3. 有序数组的平方4. 长度最小的子数组5. 螺旋矩阵 二、链表1. 删除链表元素2. 设计链表3.反转链表4.两两交换链表中的节点5.删除链表倒数第n个节点6.环形链表 提前声明&#xff1a;本博客内容均为笔者为了方便个人理解…...

内网穿透的底层原理是什么

目录 内网穿透的功能 内网穿透的底层原理 内网穿透的功能 前段时间研究了一下内网穿透&#xff0c;果真是一个神奇的技术&#xff0c;就拿企业级内网穿透-神卓互联来说&#xff0c;在需要在本地安装一个神卓互联客户端&#xff0c;简单设置一下服务应用的端口号&#xff0c;就…...

Bash配置文件

当Bash以登录Shell启动的时候&#xff0c;会首先读取并执行文件“/etc/profile”中的命令。 接着&#xff0c;Bash会依次查找文件“~/.bash_profile”&#xff0c;“~/.bash_login”&#xff0c;“~/.profile”&#xff0c;读取并执行找到的第一个文件中的命令。也就是说&…...

写Acknowledgement的时候,latex日志出现警告

用latex写论文的时候&#xff0c;\section{Conclusion}下面添加 \backmatter \bmhead{Acknowledgments}时报错&#xff1a;错误log&#xff1a; \bmhead Package hyperref Warning: Difference (4) between bookmark levels is greater than one, level....错误原因&#xff…...

GCC生成map文件

要生成GCC的map文件&#xff0c;可以使用以下指令&#xff1a; gcc <source_files> -Wl,-Map<output_file>.map 其中&#xff0c; <source_files>是要编译的源文件列表&#xff0c;<output_file>是生成的map文件的名称-Wl选项告诉GCC将后面的参数传…...

IOS看书最终选择|源阅读转换|开源阅读|IOS自签

环境&#xff1a;IOS想使用 换源阅读 问题&#xff1a;换新手机&#xff0c;源阅读下架后&#xff0c;没有好的APP阅读小说 解决办法&#xff1a;自签APP 转换源仓库书源 最终预览 &#xff1a;https://rc.real9.cn/ 背景&#xff1a;自从我换了新iPhone手机&#xff0c;就无法…...

easyui实用点

easyui实用点 1.下拉框&#xff08;input框只能选不能手动输入编辑&#xff09; data-options"editable:false"//不可编辑2.日期框&#xff0c;下拉框&#xff0c;文本框等class class"easyui-datebox"//不带时分秒 class"easyui-datetimebox"…...

算法训练营第五十六天||● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 编辑距离总结篇

● 583. 两个字符串的删除操作 这道题涉及到两个字符串删除操作&#xff0c;注意递推公式&#xff0c;理解不到位&#xff0c;需要再次做 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾…...

C语言每日一题:10.不使用+-*/实现加法+找到所有数组中消失的数。

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a; 1.两个数二进制之间进行异或如果不产生进位操作那么两个数的和就是就是两个数进行异或的结果。 举例&#xff1a;5&#xff08;0101&#xff09;2&#xff08;0010&#xff09;进行异或等于&#xff1a;7&#xf…...

LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

1、问题&#xff1a; https://github.com/CocoaPods/Specs.git/&#xff1a;LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443的解决办法 出现这个问题的原因基本都是代理的问题&#xff1a; 只需要加上代理就可以了&#xff1a; #http代理 git conf…...

JS数组的详解与使用

什么是数组&#xff1f; 数组是一种有序的集合&#xff0c;有长度和索引&#xff0c;以及身上有许多的API方法 面试题&#xff1a;数组和伪数组的区别&#xff1a;数组和伪数组都有长度和索引&#xff0c;区别是数组身上有许多的API方法 而伪数组身上不存在这些API方法创建数组…...

c++ / python / java / PHP / SQL / Ruby / Objective-C / JavaScript 发展史

c发展史 C是由丹尼斯里奇和肯汤普森在1970年代早期开发的C语言的扩展。C最初被称为“C with Classes”&#xff0c;是在1980年代初期由比雅尼斯特劳斯特鲁普开发的。 1983年&#xff0c;斯特劳斯特鲁普将C with Classes重新命名为C。在1985年&#xff0c;C编译器的第一个版本被…...

Linux第一个小程序-进度条(缓冲区概念)

1.\r和\n C语言中有很多字符 a.可显字符 b.控制字符 对于回车其实有两个动作&#xff0c;首先换行&#xff0c;在将光标指向最左侧 \r &#xff1a;回车 \n&#xff1a;换行 下面举个例子&#xff1a; 把\n去掉会怎样 什么都没输出。为什么&#xff1f; 2.缓冲区概念 观察下两个…...

CentOS7环境安装tomcat

环境准备 由于是在练习&#xff0c;为了方便&#xff0c;我们可以 1.关闭防火墙 systemctl disable firewalld.service systemctl stop firewalld.service 2.关闭selinux 在/etc/selinux/config中&#xff0c;设置&#xff1a; SELINUXdisabled 3.准备jdk---》jdk-8u333-li…...

从霍金难题到MESI协议:原子操作性能瓶颈的硬件根源与优化实践

1. 项目概述&#xff1a;从霍金的难题到现代CPU的协同困境 如果你写过并发程序&#xff0c;或者研究过Linux内核的同步机制&#xff0c;你一定对“原子操作”和“缓存一致性”这两个词不陌生。我们常常被告知&#xff0c;原子操作是昂贵的&#xff0c;因为它需要“锁总线”或者…...

3Dmigoto:如何让破败的立体游戏重获新生?

3Dmigoto&#xff1a;如何让破败的立体游戏重获新生&#xff1f; 【免费下载链接】3Dmigoto DX11 modding wrapper to enable fixing broken stereoscopic effects. Warning: 3Dmigoto[.]com is a phishing site, not us. 项目地址: https://gitcode.com/gh_mirrors/3d/3Dmig…...

上海交通大学LaTeX学术演示模板:5分钟创建专业幻灯片的完整教程

上海交通大学LaTeX学术演示模板&#xff1a;5分钟创建专业幻灯片的完整教程 【免费下载链接】SJTUBeamermin 上海交通大学 LaTeX Beamer 幻灯片模板 - VI 最小工作集 项目地址: https://gitcode.com/gh_mirrors/sj/SJTUBeamermin 想要快速制作符合上海交通大学视觉规范的…...

5分钟完成Switch注入:TegraRcmGUI终极图形化工具完整指南

5分钟完成Switch注入&#xff1a;TegraRcmGUI终极图形化工具完整指南 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI Switch注入对于许多Nintendo Switch用户…...

ComfyUI-Impact-Pack V8完整实战指南:解锁AI图像增强的5大核心功能

ComfyUI-Impact-Pack V8完整实战指南&#xff1a;解锁AI图像增强的5大核心功能 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地…...

C++图文并茂轻松进阶面向对象

一、进阶面向对象&#xff08;上&#xff09;面向对象的意义在于将日常生活中习惯的思维方式引入程序设计中将需求中的概念直观的映射到解决方案中以模块为中心构建可复用的软件系统提高软件产品的可维护性和可扩展性类和对象是面向对象中的两个基本概念类∶指的是一类事物&…...

潜变量扩散模型原理:用宝可梦类比讲透Stable Diffusion核心机制

1. 项目概述&#xff1a;用宝可梦讲清楚潜变量扩散模型到底在做什么你有没有试过让AI画一只“皮卡丘和喷火龙的混血宝宝”&#xff1f;不是简单拼接&#xff0c;而是长着皮卡丘的圆脸、喷火龙的尾巴尖带火焰、耳朵轮廓像皮卡丘但末端微微上翘——这种既熟悉又陌生、细节合理又充…...

手把手教你用SPI在两块STM32之间传浮点数(附避坑指南和字符串转换技巧)

手把手教你用SPI在两块STM32之间传浮点数&#xff08;附避坑指南和字符串转换技巧&#xff09; 在物联网传感器数据采集场景中&#xff0c;温湿度等模拟量通常以浮点数形式存在。当我们需要通过SPI协议在STM32主从机之间传输这类数据时&#xff0c;开发者往往会遇到小数位丢失、…...

SystemVerilog驱动强度详解:从概念到工程实践

1. 项目概述&#xff1a;为什么需要关注驱动强度&#xff1f;在数字电路设计和验证领域&#xff0c;SystemVerilog 是我们描述硬件行为、构建测试平台的核心语言。很多工程师&#xff0c;尤其是刚入行的朋友&#xff0c;往往把精力集中在always块、interface、UVM这些“大件”上…...

从能算到秒杀:零钱兑换与「最少硬币」的数学真相

如果说 279. 完全平方数​ 是在考你&#xff1a;&#x1f449; 最少用几个平方数拼出一个数那 322. 零钱兑换​ 就是它的「现实版」&#xff1a;&#x1f449; 最少用几枚硬币凑出一个金额这也是我第一次真正明白一句话&#xff1a;所有「最少数量」的问题&#xff0c;本质都是…...