当前位置: 首页 > 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…...

FastAPI系列 4 - 模块化路由的艺术:APIRouter实战指南

1. 为什么需要模块化路由&#xff1f; 第一次用FastAPI开发电商后台时&#xff0c;我把所有路由都堆在main.py里。三个月后这个文件膨胀到2000多行代码&#xff0c;每次修改用户认证逻辑都要在订单处理和商品列表的代码块之间来回翻找。这种经历让我深刻理解了为什么APIRouter会…...

程序员副业指南:从技术到收入的10种变现路径

CSDN程序员副业图谱技术文章大纲副业方向概览技术博客与内容创作&#xff1a;分享技术经验、教程、行业见解在线教育与课程开发&#xff1a;录制视频课程、开设直播讲座开源项目与工具开发&#xff1a;参与或主导开源项目&#xff0c;开发实用工具自由职业与远程工作&#xff1…...

Windows 11下Keil5 MDK与C51共存安装全攻略(附ST-Link驱动避坑指南)

Windows 11下Keil5 MDK与C51共存安装全攻略&#xff08;附ST-Link驱动避坑指南&#xff09; 在嵌入式开发领域&#xff0c;Keil作为经典开发工具链&#xff0c;其MDK&#xff08;Microcontroller Development Kit&#xff09;和C51版本分别服务于ARM架构和8051架构单片机开发。…...

实战指南:基于快马平台生成git自动化部署脚本,实现ci/cd流水线

今天想和大家分享一个实战中特别实用的技巧&#xff1a;如何用git结合自动化脚本来简化版本发布和部署流程。这个方案在我们团队的实际项目中已经稳定运行了大半年&#xff0c;效果非常不错。 版本号自动打tag功能 这个脚本的核心功能之一就是自动读取项目中的版本号文件&…...

微信QQ防撤回神器:RevokeMsgPatcher 2.1 终极使用教程

微信QQ防撤回神器&#xff1a;RevokeMsgPatcher 2.1 终极使用教程 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.co…...

通过配置驱动前端页面的实现方法

通过配置驱动前端页面的实现方法 配置驱动开发&#xff08;Configuration-Driven Development, CDD&#xff09;是一种通过外部配置而非硬编码来控制应用行为的开发模式。在前端领域&#xff0c;这种模式可以显著提升页面灵活性和可维护性。以下是具体实现方案&#xff1a; 理解…...

像素冒险工坊初体验:维度裂变器真实使用报告,文字创作从未如此有趣

像素冒险工坊初体验&#xff1a;维度裂变器真实使用报告&#xff0c;文字创作从未如此有趣 1. 走进像素冒险工坊 当我第一次打开像素语言维度裂变器时&#xff0c;仿佛穿越回了16-bit游戏黄金年代。这款基于MT5-Zero-Shot-Augment核心引擎构建的文本增强工具&#xff0c;彻底…...

(全网最全)分享8款AI工具,毕业论文AIGC率速降至5%!

【CSDN AI底层算法专栏 / 核心摘要】 2026年&#xff0c;学术圈的反AI审查已经演变成了一场“算法级别的军备竞赛”。随着知网、万方全面接入大模型语义探针&#xff0c;靠改同义词、甚至靠传统Prompt洗稿的套路已全线崩溃。为了帮大家避坑&#xff0c;本期专栏我从代码和算法逻…...

3步实现HTML到Word的智能转换:html-to-docx技术深度解析

3步实现HTML到Word的智能转换&#xff1a;html-to-docx技术深度解析 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 你是否曾遇到过这样的场景&#xff1f;精心设计的网页报告需要转换为Word文档进行…...

内网穿透技术应用:在本地开发机部署Qwen3-ASR-0.6B并供外网测试

内网穿透技术应用&#xff1a;在本地开发机部署Qwen3-ASR-0.6B并供外网测试 你是不是也遇到过这种情况&#xff1f;在本地电脑上好不容易部署好了一个AI模型&#xff0c;比如Qwen3-ASR-0.6B这个语音识别模型&#xff0c;自己测试跑得挺欢。结果想给同事或者朋友演示一下&#…...