职责链模式(Chain of Responsibility Pattern)

定义

职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许对象接收请求并将其沿着处理者链传递,直到有一个处理者处理它为止。职责链模式通过将请求的处理逻辑分布

在职责链模式中,通常包含以下几个角色:

  1. Handler(处理者):定义处理请求的接口,包含处理请求和设置下一个处理者的方法。

  2. ConcreteHandler(具体处理者):实现处理者接口,处理其负责的请求,如果请求不属于它的责任范围,则将其传递给链中的下一个处理者。

示例

下面是一个简单的C++示例,演示了职责链模式的应用:

#include <iostream>  
#include <string>  // 处理者接口  
class Handler {  
public:  virtual ~Handler() = default;  // 设置下一个处理者  void setNext(Handler* next) {  nextHandler = next;  }  // 处理请求  virtual void handleRequest(const std::string& request) {  if (nextHandler) {  nextHandler->handleRequest(request); // 如果存在下一个处理者,则传递给下一个处理者  } else {  std::cout << "No handler available to handle the request: " << request << std::endl;  }  }  protected:  Handler* nextHandler = nullptr; // 指向下一个处理者的指针  
};  // 具体处理者A,负责处理以"A"开头的请求  
class ConcreteHandlerA : public Handler {  
public:  void handleRequest(const std::string& request) override {  if (request.find("A") == 0) {  std::cout << "ConcreteHandlerA handles the request: " << request << std::endl;  } else {  Handler::handleRequest(request); // 如果请求不属于A处理,则传递给链中的下一个处理者  }  }  
};  // 具体处理者B,负责处理以"B"开头的请求  
class ConcreteHandlerB : public Handler {  
public:  void handleRequest(const std::string& request) override {  if (request.find("B") == 0) {  std::cout << "ConcreteHandlerB handles the request: " << request << std::endl;  } else {  Handler::handleRequest(request); // 如果请求不属于B处理,则传递给链中的下一个处理者  }  }  
};  int main() {  // 创建处理者对象并设置职责链  ConcreteHandlerA* handlerA = new ConcreteHandlerA();  ConcreteHandlerB* handlerB = new ConcreteHandlerB();  handlerA->setNext(handlerB);  // 发送请求  handlerA->handleRequest("RequestA"); // 应该由ConcreteHandlerA处理  handlerA->handleRequest("RequestB"); // 应该由ConcreteHandlerB处理  handlerA->handleRequest("RequestC"); // 没有处理者可以处理,输出错误信息  delete handlerA;  delete handlerB;  return 0;  
}

在这个示例中,我们定义了一个Handler接口和两个具体处理者ConcreteHandlerAConcreteHandlerB。每个处理者都包含一个指向下一个处理者的指针,用于构建处理者链。当处理者收到请求时,它首先检查请求是否属于它的责任范围。如果是,则处理该请求;如果不是,则将请求传递给链中的下一个处理者。如果没有处理者能够处理请求,则输出错误信息。

职责链模式的主要优点包括:

  1. 解耦:发送者和接收者之间的解耦,发送者只需要知道如何向链中传递请求,而不需要知道请求的具体处理者。

  2. 灵活性:可以通过动态地改变链内的处理者来改变请求的处理方式。

  3. 支持多个处理者:允许有多个处理者同时处理一个请求。

职责链模式的潜在缺点包括:

  1. 性能:如果链中的处理者数量很多,且请求需要逐个传递,可能会导致性能下降。

  2. 请求可能得不到处理:如果没有处理者处理请求,则请求可能会丢失或返回错误。

在实际应用中,职责链模式常用于处理异常、日志记录、命令模式中的命令执行等场景。

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

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

相关文章

MYSQL04高级_逻辑架构剖析、查询缓存、解析器、优化器、执行器、存储引擎

文章目录 ①. 逻辑架构剖析②. 服务层 - 查询缓存③. 服务层 - 解析器④. 服务层 - 优化器⑤. 服务层 - 执行器⑥. MySQL8执行原理 ①. 逻辑架构剖析 ①. 服务器处理客户端请求 ②. 连接层 系统(客户端)访问MySQL服务器前,做的第一件事就是建立TCP连接经过三次握手建立连接成…

Linux使用C语言实现通过互斥锁限制对共享资源的访问

互斥锁限制共享资源的访问 主线程中有两个线程&#xff0c;分别输出信息。 #include <stdio.h> #include <pthread.h> #include <unistd.h>int g_data0;void* fun1(void *arg) {printf("t1&#xff1a;%ld thread is create\n", (unsigned long)…

大宋咨询数据研究在汽车新品上市中的核心作用

随着汽车行业的快速变革&#xff0c;数据研究已经成为新品上市流程中的不可或缺的一环。从市场定位、产品规划到营销策略&#xff0c;数据研究不仅为汽车企业提供了独特的洞察&#xff0c;还为其提供了决策依据&#xff0c;确保新品在竞争激烈的市场中取得优势。在这一领域&…

Kubernetes IoTDB系列 | IoTDB搭建 | v1.3.0

目录 一、IoTDB 介绍二、k8s 部署 IoTDB一、IoTDB 介绍 IoTDB 是一种面向物联网(IoT)场景的开源时序数据库。它专门设计用于高效地存储和查询大规模物联网设备产生的时序数据。IoTDB 提供了高吞吐量、低延迟、灵活的数据模型以及多种数据查询和存储引擎等特性,使其成为处理…

稀疏图带负边的全源最短路Johnson算法

BellmanFord算法 Johnson算法解决的问题 带负权的稀疏图的全源最短路 算法流程 重新设置的每条边的权重都大于或等于0&#xff0c;跑完Djikstra后得到的全源最短路&#xff0c;记得要还原&#xff0c;即&#xff1a;f(u,v) d(u,v) - h[u] h[v] 例题

45、WEB攻防——通用漏洞PHP反序列化POP链构造魔术方法原生类

文章目录 序列化&#xff1a;将java、php等代码中的对象转化为数组或字符串等格式。代表函数serialize()&#xff0c;将一个对象转换成一个字符&#xff1b;反序列化&#xff1a;将数组或字符串等格式还成对象。代表函数unserialize()&#xff0c;将字符串还原成一个对象。 P…

MWC 2024丨Smart Health搭载高通Aware平台—美格发布智能健康看护解决方案,开启健康管理新体验

2月29日&#xff0c;在MWC 2024世界移动通信大会上&#xff0c;全球领先的无线通信模组及解决方案提供商——美格智能正式发布了新一代Cat.1模组SLM336Q&#xff0c;是中低速物联网应用场景的高性价比之选。本次还发布了首款搭载高通Aware™平台的智能看护解决方案MC303&#x…

[万字长文] 从 Vue 3 的项目模板学习 tsconfig 配置

文章目录 一、tsconfig.json 的作用二、基本介绍三、Vue 3 的 tsconfig.json 的结构分析1. 总配置 tsconfig.json2. Web 侧 tsconfig.app.jsona. 继承基础配置b. 包含和排除的文件c. 编译器选项 3. 测试 tsconfig.vitest.jsona. 继承的基础配置b. 包含和排除的文件c. 编译器选项…

OD(13)之Mermaid饼图和象限图

OD(13)之Mermaid饼图和象限图使用详解 Author: Once Day Date: 2024年2月29日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermaid使用指南_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting tool‍‌⁡…

FPGA-学会使用vivado中的存储器资源RAM(IP核)

问题 信号源(例如ADC)以1us一个的速率产生12位的数据现要求获得连续1ms内的数据,通过串口以115200的波特率发到电脑。 分析 数据量是1000个 数据速率不匹配 数据内容未知 数据总数据量有限 数据的使用速度低于数据的产生速度 数据生产和消耗的位宽 数据量相对较…

ywtool check命令及ywtool clean命令

一.ywtool check命令 1.1 ywtool check -I 1.2 ywtool check all 1.3 ywtool check io 1.4 ywtool check elk 1.5 ywtool check php 1.6 ywtool check mysql 1.7 ywtool check nginx 1.8 ywtool check system 1.9 ywtool check docker_nbip [容器名称] 1.10 ywtool check 1.10…

综合练习(一)

目录 列出薪金高于部门 30 的所有员工薪金的员工姓名和薪金、部门名称、部门人数 列出与 ALLEN从事相同工作的所有员工及他们的部门名称、部门人数、领导姓名 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 列出薪金高于部门 30 的所…

Linux login命令教程:如何终端登录系统、管理用户会话(附实例详解和注意事项)

Linux login命令介绍 login 命令用于登录到系统。它要求用户输入用户名和密码&#xff0c;然后验证这些凭据并启动一个新的会话。通常&#xff0c;login 命令用于文本终端登录&#xff0c;但也可以在图形界面中使用。 Linux login命令适用的Linux版本 login 命令在所有主要的…

基于JSON的Ollama和LangChain agent

到目前为止&#xff0c;我们都可能意识到&#xff0c;通过为LLMs提供额外的工具&#xff0c;我们可以显著增强它们的功能。 例如&#xff0c;即使是ChatGPT在付费版本中也可以直接使用Bing搜索和Python解释器。OpenAI更进一步&#xff0c;为工具使用提供了经过优化的LLM模型&am…

17. 电话号码的字母组合(力扣LeetCode)

文章目录 17. 电话号码的字母组合回溯算法 17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例…

js方法 提前结束循环

http://t.csdnimg.cn/j0gkOhttp://t.csdnimg.cn/j0gkO 一、各种循环方法如何跳出整个循环&#xff1f; 对于forEach()方法&#xff0c;目前似乎没有比较优雅的跳出整个循环的方法&#xff0c;如果你实在要用forEach()方法并且需要在某种条件下跳出整个循环提高遍历效率&#x…

政安晨:【掌握AI的深度学习工具Keras API】(二)—— 【使用内置的训练循环和评估循环】

渐进式呈现复杂性&#xff0c;是指采用一系列从简单到灵活的工作流程&#xff0c;并逐步提高复杂性。这个原则也适用于模型训练。Keras提供了训练模型的多种工作流程。这些工作流程可以很简单&#xff0c;比如在数据上调用fit()&#xff0c;也可以很高级&#xff0c;比如从头开…

uniapp实战:父子组件传参之子组件数量动态变化

需求说明 现有的设置单元列表,每个带有虚线加号的可以看做是一组设置单元,点击加号可以添加一组设置单元.点击设置单元右上角可以删除对应的设置单元. 实现思路说明 利用数组元素添加或是删除的方式实现页面数量动态变化.由于每个设置单元内容都相同所以单独封装了一个子组件.…

高效备考2025年AMC8数学竞赛:2000-2024年AMC8真题练一练

如何提高小学和初中数学成绩&#xff1f;小学和初中可以参加的数学竞赛有哪些&#xff1f;不妨了解一下AMC8美国数学竞赛&#xff0c;现在许多小学生和初中生都在参加这个比赛。如果孩子有兴趣&#xff0c;有余力的话可以系统研究AMC8的历年真题&#xff0c;即使不参加AMC8竞赛…

YOLOv9大幅度按比例减小模型计算量!加快训练!

一、代码及论文链接&#xff1a; 代码链接&#xff1a;GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 论文链接&#xff1a;https://github.com/WongKinYiu/yolov9/tree/main 二…