(三)行为模式:1、责任链模式(Chain of Responsibility Pattern)(C++示例)

news/2024/4/19 0:11:14

目录

1、责任链模式(Chain of Responsibility Pattern)含义

2、责任链模式的UML图学习

3、责任链模式的应用场景

4、责任链模式的优缺点

5、C++实现责任链模式的实例


1、责任链模式(Chain of Responsibility Pattern)含义

责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。【DP】

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求的发送者和接收者解耦,使多个对象都有机会处理该请求。

每个接收者都包含对下一个接收者的引用,形成一个链条,当一个请求在链条上传递时,直到有一个接收者能够处理它为止。

2、责任链模式的UML图学习

责任链模式主要包含以下几个角色:

(1)抽象处理者(Handler):定义了处理请求的接口,并持有下一个处理者的引用。

(2)具体处理者(Concrete Handler):实现了抽象处理者的接口,具体处理请求的逻辑。如果自己无法处理请求,则将请求传递给下一个处理者。

3、责任链模式的应用场景

(1)有多个对象可以处理同一个请求,但具体处理者在运行时才能确定。

(2)需要动态地指定处理请求的顺序。

(3)发送者和接收者之间的关系应该被解耦。

4、责任链模式的优缺点

(1)优点:

        1)解耦发送者和接收者:请求发送者不需要知道具体的接收者,只需要将请求发送给第一个处理者即可,由处理者之间的关系来决定谁来处理请求。

        2)可扩展性:可以动态地增加或修改处理者,灵活地调整责任链的结构。

        3)可配置性:可以通过配置文件或其他方式来确定责任链的顺序和组成。

(2)缺点:

        1)请求可能无法被处理:如果没有合适的处理者来处理请求,请求可能会被忽略或丢失。

        2)性能影响:由于请求需要在责任链上传递,可能会影响系统的性能。

5、C++实现责任链模式的实例


#include <iostream>// 抽象处理者
class Handler 
{
public:virtual void setNext(Handler* handler) = 0;virtual void handleRequest(int request) = 0;
};// 具体处理者A
class ConcreteHandlerA : public Handler 
{
private:Handler* nextHandler;public:void setNext(Handler* handler) override {nextHandler = handler;}void handleRequest(int request) override {if (request >= 0 && request < 10) {std::cout << "ConcreteHandlerA 处理请求:" << request << std::endl;}else if (nextHandler != nullptr) {nextHandler->handleRequest(request);}}
};// 具体处理者B
class ConcreteHandlerB : public Handler 
{
private:Handler* nextHandler;public:void setNext(Handler* handler) override {nextHandler = handler;}void handleRequest(int request) override {if (request >= 10 && request < 20) {std::cout << "ConcreteHandlerB 处理请求:" << request << std::endl;} else if (nextHandler != nullptr) {nextHandler->handleRequest(request);}}
};// 具体处理者C
class ConcreteHandlerC : public Handler 
{
private:Handler* nextHandler;public:void setNext(Handler* handler) override {nextHandler = handler;}void handleRequest(int request) override {if (request >= 20 && request < 30) {std::cout << "ConcreteHandlerC 处理请求:" << request << std::endl;} else if (nextHandler != nullptr) {nextHandler->handleRequest(request);}}
};int main() 
{// 创建具体处理者对象ConcreteHandlerA handlerA;ConcreteHandlerB handlerB;ConcreteHandlerC handlerC;// 设置责任链的顺序handlerA.setNext(&handlerB);handlerB.setNext(&handlerC);// 发送请求handlerA.handleRequest(5);handlerA.handleRequest(15);handlerA.handleRequest(25);return 0;
}

在上述示例中,抽象处理者(Handler)定义了处理请求的接口和设置下一个处理者的方法。具体处理者(ConcreteHandler)继承自抽象处理者,并实现了处理请求的逻辑。每个具体处理者都持有下一个处理者的引用,在处理请求时,如果满足条件,则处理请求;否则将请求传递给下一个处理者。


http://www.ppmy.cn/news/1040509.html

相关文章

CSS变形与动画(三):animation帧动画详解(用法 + 四个例子)

文章目录 animation 帧动画使用定义例子1 字母例子2 水滴例子3 会动的边框例子4 旋转木马 animation 帧动画 定义好后作用于需要变化的标签上。 使用 animation-name 设置动画名称 animation-duration: 设置动画的持续时间 animation-timing-function 设置动画渐变速度 anim…

财务数据分析用什么软件好?财务数据分析的几个重要数据是什么?

财务的数据分析也分很多种的&#xff0c;就拿最粗略的划分来说&#xff0c;也可以分为3大领域—— 财务数据处理类工具财务数据挖掘类工具财务数据可视化工具 01 数据处理类 在财务数据处理这一块儿&#xff0c;不用说&#xff0c;当然是以excel为主力的数据处理类工具—— …

zotero在不同系统的安装(win/linux)

1 window系统安装 zotero 官网&#xff1a; https://www.zotero.org/ 官方文档 &#xff1a;https://www.zotero.org/support/ (官方)推荐常用的插件: https://www.zotero.org/support/plugins 入门视频推荐&#xff1a; Zotero 文献管理与知识整理最佳实践 点击 exe文件自…

postgresql中基础sql查询

postgresql中基础sql查询 创建表插入数据创建索引删除表postgresql命令速查简单查询计算查询结果 利用查询条件过滤数据模糊查询 创建表 -- 部门信息表 CREATE TABLE departments( department_id INTEGER NOT NULL -- 部门编号&#xff0c;主键, department_name CHARACTE…

Redis——哨兵模式(docker部署redis哨兵)+缓存穿透和雪崩

哨兵模式 自动选取主机的模式。 概述 主从切换技术的方法是:当主服务器宕机后&#xff0c;需要手动把一台从服务器切换为主服务器&#xff0c;这就需要人工干预&#xff0c;费事费力&#xff0c;还会造成段时间内服务不可用。这不是一种推荐的方式&#xff0c;更多时候&…

axios使用axiosSource.cancel取消请求后怎么恢复请求,axios取消请求和恢复请求实现

在前端做大文件分片上传&#xff0c;或者其它中断请求时&#xff0c;需要暂停或重新请求&#xff0c;比如这里大文件上传时&#xff0c;可能会需要暂停、继续上传&#xff0c;如下GIF演示&#xff1a; 这里不详细说文件上传的处理和切片细节&#xff0c;后续有时间在出一篇&a…

vue项目引入antDesignUI组件

快速安装ant-design-vue并配置&#xff0c;vue2.0 antDesign1.7.8 第一步&#xff1a;安装ant-deisgn-vue 1.7.8 npm install ant-design-vue1.7.8 --save第二步&#xff1a;配置package.json文件&#xff0c;将依赖写入后&#xff0c;npm install 安装依赖 "dependenc…

用于智能图像处理的计算机视觉和 NLP

莫斯科&#xff0c;神秘之城...&#xff08;这张照片由伊戈尔沙巴林提供&#xff09; 一、说明 如今&#xff0c;每个拥有智能手机的人都可能成为摄影师。因此&#xff0c;每天都有大量新照片出现在社交媒体、网站、博客和个人照片库中。尽管拍照的过程可能非常令人兴奋&#x…

AutoSAR配置与实践(基础篇)3.2 BSW中的I/O架构和模块详解

AutoSAR配置与实践(基础篇)3.2 BSW中的I/O架构和模块详解 一、 BSW中的I/O架构和模块详解1.1 I/O 模块构成1.2 各子模块功能详解二、举例说明I/O 模块如何配合完成信号采集2.1 硬件处理先行 (step1-4)2.2 AUTOSAR软件登场(step 5-7)2.3 回顾总结下IO抽象层(IoHwAb)的隔离过…

【Rust】Rust学习 第十五章智能指针

指针 &#xff08;pointer&#xff09;是一个包含内存地址的变量的通用概念。这个地址引用&#xff0c;或 “指向”&#xff08;points at&#xff09;一些其他数据。Rust 中最常见的指针是第四章介绍的 引用&#xff08;reference&#xff09;。引用以 & 符号为标志并借用…

JVM性能分析-jstat工具观察gc频率

jstat jstat是java自带的工具&#xff0c;在bin目录下 用法 语法&#xff1a;jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] [kqkyyj-2 bin]$ jstat -help Usage: jstat -help|-optionsjstat -<option> [-t] [-h&l…

256创作纪念日

不知不觉已经是写博客的第256天了&#xff0c;从一个躺平的人变成一个为一件事能坚持并不断去做是真的很爽&#xff0c;回过头看看自己&#xff0c;写了好多东西&#xff0c;也慢慢在成长&#xff0c;不再是以前那个只会玩的小孩了。 1、自我介绍 我是来自西安的一名准大三学…

FPGA芯片IO口上下拉电阻的使用

FPGA芯片IO口上下拉电阻的使用 为什么要设置上下拉电阻一、如何设置下拉电阻二、如何设置上拉电阻为什么要设置上下拉电阻 这里以高云FPGA的GW1N-UV2QN48C6/I5来举例,这个芯片的上电默认初始化阶段,引脚是弱上来模式,且模式固定不能通过软件的配置来改变。如下图所示: 上…

matlab初

matlab语言方式与c有很大的相似之处&#xff0c;此篇记录一下自己初步学习matlab的一些过程和代码 学习matlab主要是从b站上&#xff0c;也从matlab官网去学习了一下相关感兴趣的函数 版本是之前下好的R2022b 1.变量命名&#xff0c;这与c语言变量命名要求的规则非常相似 简单…

sql server Varchar转换为Datetime

将Varchar转换为Datetime是一个常见的需求&#xff0c;在处理日期和时间数据时特别有用。在SQL Server中&#xff0c;可以使用CONVERT函数或CAST函数将Varchar转换为Datetime。 使用CONVERT函数 CONVERT函数可以将一个值从一个类型转换为另一个类型。以下是使用CONVERT函数将…

Flask下载文件报错304 NOT MODIFIED

文章目录 问题描述解决方案参考文献 问题描述 前端 Vue 下下来的文件无法正常打开&#xff0c;大小比正常的略大一点&#xff0c;通过 Postman 直接调用是正常的 解决方案 由前端解决 如果响应大小比文件略大一点&#xff0c;从 responses 中取出关键数据再组成文件如果响应…

Python 数组操作指南:使用示例和方法解析

什么是 Python 数组? 数组是一种基本数据结构,也是大多数编程语言的重要组成部分。在 Python 中,它们是能够同时存储多个项目的容器。具体来说,它们是元素的有序集合,每个值都具有相同的数据类型。这是关于 Python 数组需要记住的最重要的事情 - 它们只能保存相同类型的多…

Python学习日志(一)

我的pythonn学习路线开始咯&#xff0c;在此记录下我的学习历程。 第一个python程序&#xff1a; 当然是程序员的浪漫&#xff0c;“你好世界”。 print("hello world") 记住是“print”&#xff0c;不是“printf" 字面量 python里也有整数&#xff0c;浮…

Java Vue 前后端 关于时间格式数据的处理方法

前端使用 elment-ui 组件 el-date-picker 其中组件需要格式化时间&#xff0c;增加属性 value-format"yyyy-MM-dd" 后端 Java 接收参数类型 后端Dto 使用Date接收&#xff0c;并添加JsonFormat注解 JsonFormat(pattern"yyyy-MM-dd") private Date testTi…

K8s实战4-使用Helm在Azure上部署Ingress-Nginx和Tokengateway

手动发布Ingress-Nginx 1 登录到aks(dfinder-gw-aks) az login az account set --subscription ${sub ID} az aks get-credentials --resource-group ${groupname} --name ${aks name} 2 下载 ingress-nginx-4.2.5.tgz curl -LO https://github.com/kubernetes/ingress-ngi…