设计模式的艺术-职责链模式

行为型模式的名称、定义、学习难度和使用频率如下表所示:

1.如何理解职责链模式

  1. 最常见的职责链是直线型,即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并让请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,实现请求发送者和请求处理者解耦。

  2. 职责链模式(Chain of Responsibility Pattern):避免将请求发送者与接收者耦合在一起,让多个对象都有机会接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式

  3. 职责链模式通过建立一条链来组织请求的处理者。请求将沿着链进行传递,请求发送者无须知道请求在何时、何处以及如何被处理,实现了请求发送者与处理者的解耦。在软件开发中,如果遇到有多个对象可以处理同一请求时可以应用职责链模式。例如,在Web应用开发中创建一个过滤器(Filter)链来对请求数据进行过滤,在工作流系统中实现公文的分级审批等。

  4. 职责链模式的适用场景通常具有以下特点:存在一系列有序的处理步骤或环节,每个环节的处理者具有不同的职责和处理能力,并且处理的顺序和具体的处理者可能会根据情况动态变化。

2.如何理解纯与不纯的职责链模式

  1. 纯的职责链模式

    1. 概念:一个请求必须被链中的某个处理者处理,而且每个处理者要么处理请求,要么将请求传递给下一个处理者,不存在中途终止传递的情况。也就是说,在纯的职责链模式中,请求一定会沿着链传递下去,直到有一个处理者能够处理它为止。

    2. 常见的业务场景:审批流程、消息传递、事件的处理等。

    3. 优点:解耦请求发送者和接收者、增强了系统的灵活性、实现了职责的分离、动态分配职责、提高了代码的可维护性和可扩展性等。

  2. 不纯的职责链模式

    1. 概念:允许某个处理者在处理请求后,停止请求的传递,或者在处理不了请求的情况下也不传递给下一个处理者。这可能导致某些情况下请求得不到处理。

    2. 常见的业务场景:部份可中断的流程、条件性处理、优先级的处理、异步处理的部分场景等。

    3. 优点:提高效率、灵活控制流程、减少不必要的处理

3.职责链模式的优缺点

  1. 优点

    1. 解耦请求者和处理者:使得请求的发送方不需要知道具体由谁来处理请求,降低了它们之间的直接依赖。

    2. 增强了灵活性:可以轻松地添加、删除或重新排列处理者,而无需修改请求发送方的代码。

    3. 提高了系统的可扩展性:新的处理者可以方便地加入到职责链中,以处理新的请求类型或扩展现有功能,符合开闭原则。

    4. 职责分离:每个处理者只关注自己的处理逻辑,职责明确,易于维护和理解。

  2. 缺点

    1. 不能保证请求一定被处理:在纯的职责链模式中,如果所有处理者都无法处理请求,可能会导致请求无人处理;在不纯的模式中,如果控制不当,也可能出现请求被遗漏的情况。

    2. 可能导致性能问题:如果职责链过长,请求的传递和处理可能会带来一定的性能开销。

    3. 如果建链不当,可能会造成循环调用,将导致系统陷入死循环

4.职责链模式的适用场景

  1. 审批流程:如请假申请、费用报销审批等,不同级别的人员按照一定顺序进行审批。

  2. 工作流处理:在复杂的业务流程中,如订单处理流程,包括下单、库存检查、支付、发货等环节,每个环节由不同的处理者负责。

  3. 消息过滤和处理:在消息中间件中,对不同类型、优先级或来源的消息进行过滤和处理。

  4. 任务分配:将任务按照一定规则分配给不同的处理者,每个处理者根据自身条件决定是否接受并处理任务。

以上内容为根据书本内容配合搜索引擎整理得来,目的是为了学习,要是有侵权的情况发生,请联系我,我会立即予以删除,谢谢!

一起成长,人生是马拉松,可以跑得慢,但一定要在路上。

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

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

相关文章

js学习笔记(2)

一、函数 1.JavaScript 函数语法 函数就是包裹在花括号中的代码块,前面使用了关键词 function: function functionname() {// 执行代码 } 当调用该函数时,会执行函数内的代码。 可以在某事件发生时直接调用函数(比如当用户点…

洛谷刷题1-3

比较巧妙,求最小公倍数,看多少个数一次循环,直接求解就好了,N的数量级比较大,一层循环也会超时,也用了点双指针的想法(归并排序) 这里很大的问题,主要是cin输入的时候遇到…

2025年数学建模美赛:A题分析(1)Testing Time: The Constant Wear On Stairs

2025年数学建模美赛 A题分析(1)Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析(2)楼梯磨损分析模型 2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型 2025年数学建模美赛 A题分…

云原生时代,如何构建高效分布式监控系统

文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目,由于其良好的架构设计和完善的生态,迅速成为了监控…

每天五分钟深度学习pytorch:基于VGG神经网络完成CAFIR10的识别

本文重点 前面的所有模型我们都是使用VGG跑了mnist数据集,本次我们换一个数据集,我们使用CAFIR数据集,这个数据集我们前面介绍过,它和mnist不一样了,mnist是灰度图,这个是彩色图,所以它的通道数是3,这样我们再构建卷积神经网路的时候,第一个卷积层的输入通道数就应该…

力扣707题(2)——设计链表

#题目 #3,5和6的代码 今天看剩下几个题的代码,1,2,4的代码已经在上篇博客写过了想看的小伙伴移步到: 力扣707题——设计链表-CSDN博客 //第3题头插法 void addAtHead(int val){ //记录头结点ListNode nhead; //新节点的创建,并让它指向原本头结点的后…

STM32_SD卡的SDIO通信_基础读写

本篇将使用CubeMXKeil, 创建一个SD卡读写的工程。 目录 一、SD卡要点速读 二、SDIO要点速读 三、SD卡座接线原理图 四、CubeMX新建工程 五、CubeMX 生成 SD卡的SDIO通信部分 六、Keil 编辑工程代码 七、实验效果 实现效果,如下图: 一、SD卡 速读…

CPU 缓存基础知识

并发编程首先需要简单了解下现代CPU相关知识。通过一些简单的图,简单的代码,来认识CPU以及一些常见的问题。 目录 CPU存储与缓存的引入常见的三级缓存结构缓存一致性协议MESI协议缓存行 cache line 通过代码实例认识缓存行的重要性 CPU指令的乱序执行通过…

【博客之星】年度总结:在云影与墨香中探寻成长的足迹

🐇明明跟你说过:个人主页 🔖行路有良友,便是天堂🔖 目录 一、年度回顾 1、创作历程 2、个人成长 3、个人生活与博客事业 二、技术总结 1、赛道选择 2、技术工具 3、实战项目 三、前景与展望 1、云原生未来…

2024 自主创业事业小结和2025展望

一 2024创业事业小结: 1.1 2024 自主创业项目小结: 2024年我们小团队主要做了两大类的项目: 1,工业类 在工业领域的项目,我们做了3个落地的视觉集成项目。 1.1 旋转角度的测量: 由于是外包项目&#…

Redis使用基础

1 redis介绍 Redis(Remote Dictionary Server ),即远程字典服务 ! 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并…

激光雷达和相机早期融合

通过外参和内参的标定将激光雷达的点云投影到图像上。 • 传感器标定 首先需要对激光雷达和相机(用于获取 2D 图像)进行外参和内参标定。这是为了确定激光雷达坐标系和相机坐标系之间的转换关系,包括旋转和平移。通常采用棋盘格等标定工具&…

HMV Challenges 022 Writeup

题目地址:https://hackmyvm.eu/challenges/challenge.php?c022 首先猜测是否为图片隐写,无果 盲猜图片上的小鸟是某种带符号的隐写 去这个网站找找看:https://www.dcode.fr/chiffres-symboles 找到了 参照原图片鸟儿的姿态选择并排放 所…

FPGA与ASIC:深度解析与职业选择

IC(集成电路)行业涵盖广泛,涉及数字、模拟等不同研究方向,以及设计、制造、封测等不同产业环节。其中,FPGA(现场可编程门阵列)和ASIC(专用集成电路)是两种重要的芯片类型…

【前端】Hexo 建站指南

文章目录 前言生成站点本地测试部署云端参考 前言 更好的阅读体验:https://blog.dwj601.cn/FrontEnd/Hexo/build-your-own-website-with-hexo/ 笔记记多了,想要分享给同学们一起交流进步,该怎么办?想要搭建一个属于自己的知识库…

抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目

写这篇文章的初衷并不是要大家真的不用node和vscode,说实话前端发展成今天这样,在实际开发中确实离不开node和vscode这类工具了,但往往工具用多了我们自己也成了一个工具人! 这篇文章的缘由 最近在开发wordpress插件的时候&…

Gin 学习笔记

教程地址:https://www.bilibili.com/video/BV1FV4y1C72M?spm_id_from333.788.videopod.sections&vd_source707ec8983cc32e6e065d5496a7f79ee6 01-项目搭建 各常用目录的说明: https://github.com/golang-standards/project-layout/blob/master/REA…

麒麟操作系统服务架构保姆级教程(十四)iptables防火墙四表五链和防火墙应用案例

如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情 防火墙在运维工作中有着不可或缺的重要性。首先,它是保障网络安全的关键防线,通过设置访问控制规则,可精准过滤非法网络流量,有效阻挡外部黑客攻击、恶…

双目立体校正和Q矩阵

立体校正 对两个摄像机的图像平面重投影,使二者位于同一平面,而且左右图像的行对准。 Bouguet 该算法需要用到双目标定后外参(R,T) 从上图中可以看出,该算法主要分为两步: 使成像平面共面 这个办法很直观&#xff…

【C++】string类模拟实现

目录 💕1.模拟string类构造函数 💕2.模拟构造函数实现 💕3.拷贝构造函数模拟实现 💕4.析构函数模拟实现 💕5.size函数,capacity函数模拟实现 💕6.begin函数,end函数,模拟实…