责任链模式的C++实现示例

核心思想

责任链模式是一种行为设计模式,允许多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合。请求沿着处理链传递,直到某个对象处理它为止。

解决的问题

解耦请求发送者与处理者:请求的发送者无需知道具体由哪个对象处理请求。
​动态分配责任:可以在运行时动态调整处理链,灵活添加或移除处理者。
​避免硬编码:避免将请求处理逻辑硬编码在某个类中,提高代码的可扩展性和可维护性。

使用场景

​多级审批流程:如请假审批、报销审批等,每一级领导都可以处理或传递给上级。
​事件处理系统:如 GUI 事件处理,事件可以沿着组件链传递,直到被处理。
​日志记录系统:不同级别的日志消息可以被不同的日志处理器处理。
​过滤器链:如 HTTP 请求过滤器,每个过滤器可以处理请求或传递给下一个过滤器。

优点

​解耦:请求发送者与处理者解耦,发送者无需知道具体处理者。
​动态性:可以在运行时动态调整处理链。
​单一职责:每个处理者只关注自己的职责,符合单一职责原则。

缺点

​性能问题:如果链过长,可能导致请求传递效率低下。
​不确定性:请求可能未被任何处理者处理,需要额外逻辑处理这种情况。

示例代码

以下是一个简单的责任链模式示例,模拟多级审批流程:

#include <iostream>
#include <memory>
#include <string>// 请求类
class Request {
public:Request(const std::string& content, int level) : content_(content), level_(level) {}std::string getContent() const { return content_; }int getLevel() const { return level_; }private:std::string content_; // 请求内容int level_;           // 请求级别
};// 处理者基类
class Handler {
public:virtual ~Handler() = default;void setNext(std::shared_ptr<Handler> next) { next_ = next; }virtual void handleRequest(const Request& request) {if (next_) {next_->handleRequest(request); // 传递给下一个处理者} else {std::cout << "Request未被处理: " << request.getContent() << std::endl;}}protected:std::shared_ptr<Handler> next_; // 下一个处理者
};// 具体处理者:经理
class Manager : public Handler {
public:void handleRequest(const Request& request) override {if (request.getLevel() <= 1) {std::cout << "经理处理请求: " << request.getContent() << std::endl;} else {Handler::handleRequest(request); // 传递给下一个处理者}}
};// 具体处理者:总监
class Director : public Handler {
public:void handleRequest(const Request& request) override {if (request.getLevel() <= 2) {std::cout << "总监处理请求: " << request.getContent() << std::endl;} else {Handler::handleRequest(request); // 传递给下一个处理者}}
};// 具体处理者:CEO
class CEO : public Handler {
public:void handleRequest(const Request& request) override {if (request.getLevel() <= 3) {std::cout << "CEO处理请求: " << request.getContent() << std::endl;} else {Handler::handleRequest(request); // 传递给下一个处理者}}
};int main() {// 创建处理链auto manager = std::make_shared<Manager>();auto director = std::make_shared<Director>();auto ceo = std::make_shared<CEO>();manager->setNext(director);director->setNext(ceo);// 创建请求Request request1("请假1天", 1);  // 经理处理Request request2("请假3天", 2);  // 总监处理Request request3("请假10天", 3); // CEO处理Request request4("请假30天", 4); // 未被处理// 处理请求manager->handleRequest(request1);manager->handleRequest(request2);manager->handleRequest(request3);manager->handleRequest(request4);return 0;
}

输出结果

经理处理请求: 请假1天
总监处理请求: 请假3天
CEO处理请求: 请假10天
Request未被处理: 请假30天

代码解析

Request 类:封装请求内容和级别。
Handler 基类:定义处理请求的接口,并持有下一个处理者的指针。
​具体处理者 Manager、Director、CEO​:实现自己的处理逻辑,若无法处理则传递给下一个处理者。
​处理链:通过 setNext 方法动态构建处理链。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31776.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JU TPS研究笔记

这个模板的Cover Demo和尘白禁区一样&#xff0c;是自由观察和背后锁定视角可切换的TPS。这种模式比单独做自由观察或背后锁定都要复杂。在非瞄准也就是自由观察状态&#xff0c;鼠标控制相机转动&#xff0c;WASD控制人物以相机前方为前方一边移动一边平滑旋转到面对移动方向。…

[NewStarCTF 2023 公开赛道]ez_sql1 【sqlmap使用/大小写绕过】

题目&#xff1a; 发现id处可以sql注入&#xff1a; 虽然输入id1;show databases;#没什么回显&#xff0c;但是知道这里是字符型注入了 这次利用sqlmap注入 --dbs&#xff1a;列出所有数据库名字 python .\sqlmap.py -u http://a40b2f0a-823f-4c99-b43c-08b94ed0abb2.node5.…

DeepSeek-实用集成大礼包

随着DeepSeek的持续火热,在各种平台看到大家基于deepseek+各类应用的案例。这些案例真假难辨,现在DeepSeek已经推出了官方的Awesome DeepSeek Integrations,集成了各类应用,下面是详细的介绍。 DeepSeek Integrations 是 DeepSeek 官方在 GitHub 上精心整理的一个集合了各种…

Ubuntu安装问题汇总

参考文章&#xff1a; 【Ubuntu常用快捷键总结】 【王道Python常用软件安装指引】 1. 无法连接虚拟设备 sat0:0 【问题】&#xff1a;出现下图所示弹框。 【问题解决】&#xff1a; 点击 “否” 。 点击左上角的 “虚拟机” → “设置…” → “CD/DVD (SATA)” &#xff0c;…

深陷帕金森困境,怎样重燃生活信心?

帕金森&#xff0c;这个悄然影响无数中老年人生活的神经系统疾病&#xff0c;正逐渐走进大众视野。患病后&#xff0c;患者常出现静止性震颤&#xff0c;安静时手部、下肢不自主抖动&#xff0c;如同在默默诉说着身体的异常。肢体变得僵硬&#xff0c;行动迟缓&#xff0c;起步…

空间遥感智能处理技术发展现状与趋势

在数字化时代&#xff0c;空间遥感技术已经成为获取地球表面信息的重要手段。随着卫星遥感技术的快速发展&#xff0c;获取的遥感数据量激增&#xff0c;这对遥感数据的智能处理提出了更高的要求。本文将探讨空间遥感智能处理技术的发展现状与未来趋势。 发展现状 大数据与人工…

svn删除所有隐藏.svn文件,文件夹脱离svn控制

新建一个文件&#xff0c;取名remove-svn-folders.reg&#xff0c;输入如下内容&#xff1a; Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] "Delete SVN Folders" [HKEY_LOCAL_MACHINE\SOFTWARE\Class…

Datawhale coze-ai-assistant 笔记2

目录 快速搭建一个 AI 助手智能体 搭建步骤 步骤1&#xff1a;创建一个智能体 步骤2&#xff1a;编写提示词 步骤3&#xff1a;调试智能体 步骤4&#xff1a;发布智能体 设置智能体模型 选择模型 生成多样性 输入及输出设置 如何使用 步骤1&#xff1a;更换模型 步…

win10电脑鼠标速度突然变的很慢?

电脑鼠标突然变很慢&#xff0c;杀毒检测后没问题&#xff0c;鼠标设置也没变&#xff0c;最后发现可能是误触鼠标的“DPI”调节键。 DPI调节键在鼠标滚轮下方&#xff0c;再次点击即可恢复正常鼠标速度。 如果有和-的按键&#xff0c;速度变快&#xff0c;-速度变慢。 图源&…

若依RuoYi-Cloud-Plus微服务版(完整版)前后端部署

一.目标 在浏览器上成功登录进入 二.源码下载 后端源码&#xff1a;前往Gitee下载页面(https://gitee.com/dromara/RuoYi-Cloud-Plus)下载解压到工作目录。 前端源码&#xff1a; 前往Gitee下载页面(https://gitee.com/JavaLionLi/plus-ui)下载解压到工作目录。 文档地址&a…

vue3+elementuiplus的table表格动态高度

table表格流体高度 1、前提 了解自定义指令、hooks 2、核心思路 通过自定义指令&#xff08;new ResizeObserver&#xff09;监听表格变化&#xff0c;然后通过hooks去更新表格高度。 3、核心代码 src/directives/resize.ts // import { debounce } from /utils;import { t…

Django与数据库

我叫补三补四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲alpha策略制定后的测试问题 mysql配置 Django模型体现了面向对象的编程技术&#xff0c;是一种面向对象的编程语言和不兼容类型能相互转化的编程技术&#xff0c;这种技术也叫ORM&#…

VMware下载安装Ubuntu详解

一、Linux简介 1、不同领域的主流操作系统 桌面操作系统服务器操作系统移动设备操作系统嵌入式操作系统 1.1、桌面操作系统 Windows&#xff08;用户数量最多&#xff09;Mac OS&#xff08;苹果电脑操作系统&#xff09;Linux&#xff08;用户数量少&#xff09; 1.2、服…

动态规划详解(二):从暴力递归到动态规划的完整优化之路

目录 一、什么是动态规划&#xff1f;—— 从人类直觉到算法思维 二、暴力递归&#xff1a;最直观的问题分解方式 1. 示例&#xff1a;斐波那契数列 2. 递归树分析&#xff08;以n5为例&#xff09; 3. 问题暴露 三、第一次优化&#xff1a;记忆化搜索&#xff08;Memoiza…

下降路径最⼩和(medium)

题目描述&#xff1a; 给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始&#xff0c;并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列&#xff08…

YashanDB认证,YCA证书认证教程,免费证书,内含真题考试题库及答案——五分钟速成

目录 一.账号及平台注册登录流程 二.登录进行设备调试核验 三.考试&#xff08;考完获取分数&#xff09; 四.获取证书 五.题库及答案 一.账号及平台注册登录流程 1-点击这里进行账号注册&#xff08;首次学习必须先注册&#xff0c;有账号之后可以直接在2号链接登录&#…

texstudio: 编辑器显示行号+给PDF增加行号

texstudio在编辑器部分增加行号&#xff1a; texstudio默认在编辑器部分不显示行号&#xff0c;如下图&#xff1a; 要实现以下的在编辑部分增加行号&#xff1a; 执行如下操作&#xff1a; 选项-->设置TexStudio-->编辑器-->显示行号-->所有行号选择好后&…

解决vscode中出现“无法将pip项识别...“问题

问题 遇见问题如下&#xff1a; 查看pip 通过 winR &#xff0c;输入 cmd&#xff0c;进入终端&#xff0c;搜索 where pip。 发现 pip 查不出来&#xff0c;然后进入文件资源管理器&#xff0c;搜索 Scripts 文件夹&#xff0c;如果没有找到可能是电脑没有下载 python。 点击…

【webrtc debug tools】 rtc_event_log_to_text

一、rtc_event_log 简介 在学习分析webrtc的过程中&#xff0c;发现其内部提供了一个实时数据捕获接口RtcEventLog。通过该接口可以实时捕获进出webrtc的RTP报文头数据、音视频配置参数、webrtc的探测数据等。其内容实现可参考RtcEventLogImpl类的定义。其文件所在路径 loggin…

华为eNSP:2.配置OSPF报文分析和验证

一、OSPF的5种数据包 Hello包&#xff1a;用于发现和维护邻居关系。定期发送&#xff0c;确保邻居路由器在线。 数据库描述包&#xff08;DBD, Database Description Packet&#xff09;&#xff1a;在邻居关系建立后&#xff0c;用于交换链路状态数据库的摘要信息。 链路状…