设计模式--责任链模式

责任链模式是一种行为设计模式,它允许将请求沿着处理者链进行发送。请求会沿链传递,直到某个处理者对象负责处理它。这种模式在许多应用场景中非常有用,例如在处理用户输入、过滤请求以及实现多级审核时。

应用场景

  1. 处理用户输入:当需要根据不同的条件处理用户输入时,可以使用责任链模式来将输入请求沿处理者链进行传递,直到找到合适的处理者。
  2. 过滤请求:当需要对请求进行过滤,例如日志记录、权限检查等时,可以使用责任链模式来依次执行不同的过滤器。
  3. 实现多级审核:当需要实现一个多级审核流程,例如请假审批、报销审批等时,可以使用责任链模式来将审核请求沿审核者链进行传递。

使用技巧与注意事项

  1. 定义处理者接口:为了使用责任链模式,需要定义一个处理者接口,该接口包含处理请求的方法以及指向下一个处理者的引用。
  2. 避免链的循环引用:在构建责任链时,需要注意避免链的循环引用,确保请求能够正确地沿着链进行传递。
  3. 处理者数量的管理:责任链中的处理者数量可能会影响性能,因此需要根据实际情况合理地管理处理者数量。

C++代码示例

下面是一个使用C++编写的责任链模式示例代码:

#include <iostream>
#include <string>
// 处理者接口
class Handler {
public:virtual Handler* setNext(Handler* next) = 0;virtual void handleRequest(std::string request) = 0;virtual ~Handler() {}
};
// 具体处理者类
class ConcreteHandler : public Handler {
private:Handler* nextHandler;
public:ConcreteHandler() : nextHandler(nullptr) {}Handler* setNext(Handler* next) override {this->nextHandler = next;return this;}void handleRequest(std::string request) override {if (nextHandler != nullptr) {nextHandler->handleRequest(request);} else {std::cout << "Request: " << request << " handled by ConcreteHandler" << std::endl;}}
};
int main() {ConcreteHandler* handler1 = new ConcreteHandler();ConcreteHandler* handler2 = new ConcreteHandler();ConcreteHandler* handler3 = new ConcreteHandler();handler1->setNext(handler2)->setNext(handler3);handler1->handleRequest("Request 1");handler1->handleRequest("Request 2");handler1->handleRequest("Request 3");delete handler1;delete handler2;delete handler3;return 0;
}

在这个示例中,我们定义了一个处理者接口 Handler,它包含设置下一个处理者的方法以及处理请求的方法。具体处理者类 ConcreteHandler 实现了这些方法,并提供了处理请求的逻辑。客户端代码创建了多个处理者对象,并将它们连接成链。通过这个示例,我们可以看到责任链模式在C++中的实现。
总之,责任链模式是一种非常有用的设计模式,它可以帮助我们处理复杂的请求处理流程,提高代码的灵活性和可维护性。在实际开发中,我们需要根据具体的应用场景来选择是否使用责任链模式,并注意相关的使用技巧和注意事项。

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

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

相关文章

kafka之consumer参数auto.offset.reset

Kafka的auto.offset.reset 参数是用于指定消费者在启动时如何处理偏移量&#xff08;offset&#xff09;的。这个参数有三个主要的取值&#xff1a;earliest、latest和none。 earliest&#xff1a; 当各分区下有已提交的offset时&#xff0c;从提交的offset开始消费&#xff1b…

HCIP-VLAN综合实验

一、实验拓扑 二、实验要求 1、pc1和pc3所在接口为access;属于vlan 2; PC2/PC4/PC5/PC6处于同一网段’其中PC2可以访问PC4/PC5/PC6; PC4可以访问PC6&#xff1b;PC5不能访问PC6&#xff1b; 2、PC1/PC3与PC2/PC4/PC5/PC6不在同一个网段&#xff1b; 3、所有PC通过DHCP获取IP…

栈和队列的应用-计算器实例

‘’‘ &#xff08;11 3&#xff09; 2 -5 顺序存储栈来实现 ’‘’ sqstack.h #ifndef SQSTACK_H__ #define SQSTACK_H__ #define MAXSIZE 32 typedef int datatype typedef struct node_st {datatype data[MAXSIZE]; int top;}sqstack;sqstack *st_create(void); int s…

闲话 .NET(5):.NET Core 有什么优势?

前言 .NET Core 并不是 .NET FrameWork 的升级版&#xff0c;它是一个为满足新一代的软件设计要求而从头重新开发的开发框架和平台&#xff0c;所以它没有 .NET FrameWork 的历史包袱&#xff0c;相对于 .NET FrameWork&#xff0c;它具备很多优势。 .NET Core 有哪些优势&am…

智算中心带宽漫谈 -- 开篇

隐秘的角落 带宽对高性能计算是一个永恒的话题&#xff0c;本质上&#xff0c;带宽即数据交换的速率&#xff0c;单位时间的传输数据越多&#xff0c;带宽就越高&#xff0c;但对高性能计算来说&#xff0c;对高带宽的渴求永无止境&#xff0c;好比宏观现实世界中的车道&#…

QT实现线程的四种方式(QThread、QRunnable和QThreadPool、QObject、QtConcurrent)

在当今高性能计算需求日益增长的背景下,多线程编程已成为提升应用性能的重要手段。Qt框架,作为一个功能全面、跨平台的C++应用程序开发工具包,为我们提供了多种多线程实现方案。本文将介绍QThread类在Qt多线程编程中的应用,以及如何通过QRunnable和QThreadPool、QObject的m…

C# GDI+ 绘制文字不同的操作系统渲染文字大小不同

一、C# GDI 绘制文字不同的操作系统渲染文字大小不同 原因&#xff1a;使用Font 字体的时候&#xff0c;没有指定字体渲染的单位。 不同系统的默认字体单位会不同。 二、解决方案&#xff1a; 在指定字体的时候&#xff0c;指定字体大小&#xff0c;同时也要设置字体的单位 …

sqlserver 创建表,列及表,列描述

-- 创建表 CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,EmployeeName NVARCHAR(100),EmployeeEmail NVARCHAR(100) );-- 为表添加描述 EXEC sp_addextendedproperty name NMS_Description, value N员工信息表, level0type NSchema, level0name dbo, level1type N…

springboot整合kkFileView部署,前端使用

前言&#xff1a; 官方文档&#xff1a;https://kkfileview.keking.cn/zh-cn/docs/production.html docker方式或加入星球获取发行包直接获取启动&#xff0c;无需以下步骤&#xff1a; 拉取镜像# 网络环境方便访问docker中央仓库 docker pull keking/kkfileview:4.1.0# 网…

pytest框架的代码如何用vscode进行debug

{"version": "0.2.0","configurations": [{"name": "Python: Run My Module", // 配置名称&#xff0c;将在调试配置下拉列表中显示"type": "debugpy", // 调试类型&#xff0c;这里是Python"requ…

二元关系表示

一、二元关系的定义和表示 什么是二元关系&#xff1f;对集合A和B&#xff0c;A\timesB的任意子集R为A到B的一个二元关系。当AB时&#xff0c;A\timesA的任一子集R称为A上的一个二元关系。在不引起误解的情况下&#xff0c;二元关系可简称关系。 若|A|m,|B|n&#xff0c;则A到…

常用字体映射字典

表格形式 英文字体名称中文字体名称SimSun宋体SimHei黑体KaiTi楷体FangSong仿宋YouYuan幼圆LiSu隶书NSimSun新宋体SimSun-ExtB宋体-ExtBFangSong_GB2312仿宋_GB2312KaiTi_GB2312楷体_GB2312Microsoft YaHei微软雅黑Microsoft JhengHei微软正黑体STXihei华文细黑STKaiti华文楷体…

手机版AI写作软件哪个好用?5款AI写作软件分享

在这个快节凑的时代&#xff0c;人们对于高效、便捷的创作方式很是追求。尤其是在人工智能技术发展迅速的今天&#xff0c;AI写作软件的出现&#xff0c;让很多自媒体创作者都会想到在手机上面进内容创作&#xff0c;这样不仅能提高工作效率&#xff0c;而且工作的自由度会更高…

自动化运维(AIOps): 现代IT管理的革命

在数字化时代&#xff0c;企业的 IT 系统变得愈加复杂。从云计算到大数据&#xff0c;从物联网到人工智能&#xff0c;技术的飞速发展使得企业面临前所未有的挑战。这种复杂性不仅体现在数据量和数据流的增加上&#xff0c;还包括高成本和高错误率的运维需求。在此背景下&#…

基于51单片机的盆栽自动浇花系统

一.硬件方案 工作原理是湿度传感器将采集到的数据直接传送到ADC0832的IN端作为输入的模拟信号。选用湿度传感器和AD转换&#xff0c;电路内部包含有湿度采集、AD转换、单片机译码显示等功能。单片机需要采集数据时&#xff0c;发出指令启动A/D转换器工作&#xff0c;ADC0832根…

Hive 变量定义与引用

文章目录 1.背景2.Hive 变量命名空间查看变量设置变量引用变量 参考文献 1.背景 在书写 Hive SQL 时&#xff0c;有时需要将重复出现的值从 SQL 分离出来&#xff0c;以变量的方式表示和引用。 设置变量和引用变量可以带来以下几个好处&#xff1a; 简化查询语句&#xff1a;…

Android 实现竖排文本(垂直方向显示)

Android 实现竖排文本-垂直方向显示 前言效果图代码实现方式一 Custom View1. 自定义视图 VerticalTextView2. 在xml布局文件中使用3. 设置文本内容 方式二 使用 TextView 的 rotation属性方式三 使用带有跨距文本的TextView1. 自定义视图 VerticalTextView2. 在xml布局文件中使…

AI学习指南数学工具篇-凸优化基础知识凸函数

AI学习指南数学工具篇-凸优化基础知识凸函数 引言 在凸优化过程中&#xff0c;凸函数是一个非常重要的概念&#xff0c;它在机器学习、深度学习和优化算法中都有广泛的应用。凸函数具有很多独特的性质&#xff0c;能够帮助我们更好地理解优化问题并且设计高效的优化算法。本文…

【Golang】Golang获取Gin框架PostForm上传的文件

文章目录 前言一、函数解释二、代码实现三、总结 前言 在Web开发中&#xff0c;文件上传是一项常见的功能。例如&#xff0c;用户可能需要上传头像、文档或其他类型的文件。在Go语言的Gin框架中&#xff0c;我们可以很方便地处理文件上传。在这篇博客中&#xff0c;我将解释如…

怎样理解 Vue 的单项数据流

Vue 的单项数据流是一个核心概念&#xff0c;它指的是在 Vue 组件中&#xff0c;数据的流动方向是单向的&#xff0c;从父组件流向子组件。以下是关于 Vue 单项数据流的详细理解&#xff1a; 数据流的方向&#xff1a; Vue 中的数据流动是单向的&#xff0c;即数据只能从父组件…