设计模式--职责链模式(Chain of Responsibility Pattern)

职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它为请求创建了一个接收者对象的链。
这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在职责链模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象无法处理请求,那么它会把相同的请求传给下一个接收者,依此类推。

职责链模式主要包含以下角色:

  1. 抽象处理者(Handler):定义了一个处理请求的接口,通常包含一个指向下一个处理者的引用。
  2. 具体处理者(Concrete Handler):具体处理者接收到请求后,可以选择将请求处理掉,或者将请求传给下一个处理者。
  3. 客户类(Client):客户类负责将请求发送到链上,开始请求的处理。

职责链模式主要解决的问题是,请求的发送者不知道接收者是谁,也不知道请求的处理过程。请求在所有的处理者对象中传递,直到被某个处理者处理。这样实现了请求发送者和接收者之间的解耦。

以下是一个简单的职责链模式的 C++ 实现:

#include <iostream>// 抽象处理者
class Handler {
public:virtual ~Handler() {}virtual void setNext(Handler* handler) = 0;virtual void handleRequest(int request) = 0;
};// 具体处理者
class ConcreteHandler1 : public Handler {
public:~ConcreteHandler1() {delete next;}void setNext(Handler* handler) override {next = handler;}void handleRequest(int request) override {if (request == 1) {std::cout << "ConcreteHandler1 handled the request." << std::endl;} else if (next) {next->handleRequest(request);}}
private:Handler* next = nullptr;
};class ConcreteHandler2 : public Handler {
public:~ConcreteHandler2() {delete next;}void setNext(Handler* handler) override {next = handler;}void handleRequest(int request) override {if (request == 2) {std::cout << "ConcreteHandler2 handled the request." << std::endl;} else if (next) {next->handleRequest(request);}}
private:Handler* next = nullptr;
};// 客户端代码
int main() {Handler* handler1 = new ConcreteHandler1;Handler* handler2 = new ConcreteHandler2;handler1->setNext(handler2);handler1->handleRequest(1);handler1->handleRequest(2);delete handler1;return 0;
}

在这个例子中,ConcreteHandler1 和 ConcreteHandler2 是具体的处理者,它们都继承自抽象处理者 Handler。当接收到请求时,如果 ConcreteHandler1 能处理请求,就处理请求;否则,就将请求传递给下一个处理者 ConcreteHandler2。ConcreteHandler2 的处理逻辑与此类似。

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

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

相关文章

代码随想录 Leetcode435. 无重叠区间

题目&#xff1a; 代码(首刷看解析 2024年2月17日&#xff09;&#xff1a; class Solution { private:const static bool cmp(vector<int>& a,vector<int>& b) {return a[0] < b[0];} public:int eraseOverlapIntervals(vector<vector<int>&…

学习Android的第十二天

目录 Android SeekBar&#xff1a;拖动条控件 SeekBar 属性 SeekBar 事件 SeekBar 定制 范例&#xff1a; 参考文档 Android RatingBar 星级评分条 RatingBar 属性 RatingBar 样式 RatingBar 事件 范例&#xff1a; 官方文档 Android ScrollView 滚动视图 Scroll…

MessageQueue --- RabbitMQ

MessageQueue --- RabbitMQ RabbitMQ IntroRabbitMQ 核心概念RabbitMQ 分发类型Dead letter (死信)保证消息的可靠传递 RabbitMQ Intro 2007年发布&#xff0c;是一个在AMQP&#xff08;高级消息队列协议&#xff09;基础上完成的&#xff0c;可复用的企业消息系统&#xff0c;…

java 宠物医院系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 宠物医院系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

c语言遍历文件夹中的文件

文件目录如下&#xff0c;文件夹里还有一些txt文件未展示出来。 使用递归实现&#xff0c;深度优先遍历文件夹中的文件。 代码如下&#xff0c;用了一点C的语法。 #include <io.h> #include <iostream> using namespace std;#define MAX_PATH_LENGTH 100int Tr…

人工智能学习与实训笔记(四):神经网络之自然语言处理

目录 六、自然语言处理 6.1 词向量 (Word Embedding) 6.1.1 词向量的生成过程 6.1.2 word2vec介绍 6.1.3 word2vec&#xff1a;skip-gram算法的实现 6.2 句向量 - 情感分析 6.2.1 LSTM (Long Short-Term Memory)介绍 6.2.2 基于飞桨实现的情感分析模型 6.3 BERT 六、自…

unreal engine5.1中设置convex decomposition凸包分解

UE5系列文章目录 文章目录 UE5系列文章目录前言一、convex decomposition是什么&#xff1f;二、convex decomposition属性设置 前言 今天使用ue5根据网上教程制作可操控直升机&#xff0c;找属性convex decomposition凸包分解&#xff0c;默认的碰撞如下图 如果想使用精细化…

Android Studio安装SDK失败解决办法

Android Studio安装SDK失败解决办法 安装SDK时界面会显示安装的连接&#xff0c;同时在你选择的安装SDK的文件夹里面会生成一些目录和文件&#xff0c;在你选择放SDK的目录下有一个叫做.temp的文件夹&#xff0c;里面放的就是下载的临时文件。 .temp内部的文件夹里面能看到下…

mysql出现unblock with ‘mysqladmin flush-hosts‘

产生的原因是&#xff1a; 同一个ip在短时间内产生太多&#xff08;超过mysql数据库max_connect_errors的最大值&#xff09;中断的数据库连接而导致的阻塞。 解决方法1&#xff1a;修改max_connect_errors的值 (1)进入Mysql数据库查看max_connect_errors&#xff1a; > sh…

求最小生成树相关例题题解

一.前言 求最小生成树常用的两种算法&#xff1a;prim算法和kruskal算法&#xff0c;之前我已经总结过prim算法的相关知识和使用方法&#xff08;详细可以看这篇博客&#xff09;&#xff0c;而kruskal算法比较简单&#xff0c;更好操作&#xff08;主要通过并查集和排序&…

【深度学习】使用tensorflow实现VGG19网络

【深度学习】使用tensorflow实现VGG19网络 本文章向大家介绍【深度学习】使用tensorflow实现VGG19网络&#xff0c;主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项&#xff0c;具有一定的参考价值&#xff0c;需要的朋友可以参考一下。 VGG网络与AlexNet类似…

wayland(xdg_wm_base) + egl + opengles——dma_buf 作为纹理数据源(五)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、EGL dma_buf import 相关的数据结构和函数1. EGLImageKHR2. eglCreateImageKHR()3. glEGLImageTargetTexture2DOES()二、egl 中 import dma_buf 作为纹理的代码实例1. egl_wayland_dmabuf_…

Why Not Http?

游戏服务器开发主要是基于socket&#xff0c;或者websocket&#xff0c;很少采用http&#xff08;可能有部分非常轻量级的服务器选择http&#xff09;。这是什么原因呢&#xff1f;我们先来看看socket与http之间的区别。 socket与http之间的区别 socket与http对比 sockethttpT…

【c++】list 模拟

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能手撕list模拟 > 毒鸡汤&#xff1a;不为模糊…

红队ATKCK|红日靶场Write-Up(附下载链接)

网络拓扑图 下载地址 在线下载&#xff1a; http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ 百度网盘 链接&#xff1a;https://pan.baidu.com/s/1nlAZAuvni3EefAy1SGiA-Q?pwdh1e5 提取码&#xff1a;h1e5 环境搭建 通过上述图片&#xff0c;web服务器vm1既能用于外…

学习Android的第十三天

目录 Android TextClock 文本时钟控件 TextClock 控件主要属性和方法 简单的 TextClock 参考文档 Android AnalogClock 控件 AnalogClock 属性 Android Chronometer 计时器 Chronometer 属性 Chronometer 主要方法 范例&#xff1a; 完整的计时器 范例&#xff1a; …

Rust 学习笔记 - Hello world

前言 本文将讲解如何完成一个 Rust 项目的开发流程&#xff0c;从编写 “Hello, World!” 开始&#xff0c;到使用 Cargo 管理和运行项目。 编写 Hello world 开始一个新项目很简单&#xff0c;首先&#xff0c;创建一个包含 main.rs 文件的 hello_world 文件夹&#xff0c;…

基于Doris构建亿级数据实时数据分析系统

转载至我的博客 https://www.infrastack.cn &#xff0c;公众号&#xff1a;架构成长指南 背景 随着公司业务快速发展&#xff0c;对业务数据进行增长分析的需求越来越迫切&#xff0c;与此同时我们的业务数据量也在快速激增、每天的数据新增量大概在30w 左右&#xff0c;一年…

BUUCTF misc 专题(47)[SWPU2019]神奇的二维码

下载附件&#xff0c;得到一张二维码图片&#xff0c;并用工具扫描&#xff08;因为图片违规了&#xff0c;所以就不放了哈。工具的话&#xff0c;一般的二维码扫描都可以&#xff09; swpuctf{flag_is_not_here}&#xff0c;&#xff08;刚开始出了点小差错对不住各位师傅&am…

代码随想录第32天|● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

文章目录 买卖股票思路一&#xff1a;贪心代码&#xff1a; 思路&#xff1a;动态规划代码&#xff1a; 跳跃游戏思路&#xff1a;贪心找最大范围代码&#xff1a; 跳跃游戏②思路&#xff1a;代码&#xff1a; 方法二&#xff1a;处理方法一的特殊情况 买卖股票 思路一&#x…