设计模式: 行为型之责任链模式(14)

责任链模式概述

  • 责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许对象或对象集合以链式的方式组织在一起,以处理请求
  • 在责任链中,每个对象都包含对下一个对象的引用,并且都有机会处理请求
  • 当某个对象无法处理请求时,它会把请求传递给链中的下一个对象
  • 通过这种方式,请求会沿着责任链传递,直到被某个对象处理为止
  • 责任链模式的主要角色包括:
    • 抽象处理者(Handler)角色
      • 定义一个处理请求的接口。它包含一个指向下一个处理者的引用(即下一个处理者对象的链接)
      • 和一个处理请求的抽象方法(即处理请求的业务逻辑)
    • 具体处理者(ConcreteHandler)角色
      • 实现抽象处理者的接口,处理它负责的请求
      • 如果无法处理该请求,则转发给链中的下一个处理者
    • 客户端(Client)角色
      • 创建处理链,并向链的第一个处理者对象提交请求

责任链应用

// 首先定义一个处理请求的接口
interface Handler {nextHandler?: Handler; // 指向下一位处理器的引用// 处理请求的方法handleRequest(request: Request): void;
}// 定义一个请求类
class Request {constructor(public readonly type: string, public readonly data: any) {}
}// 创建几个处理不同类型请求的处理器类
class ConcreteHandler1 implements Handler {nextHandler?: Handler;handleRequest(request: Request): void {if (request.type === 'Type1') {console.log(`ConcreteHandler1 handled request: ${request.type}`);} else if (this.nextHandler) {this.nextHandler.handleRequest(request);} else {console.log('No handler found for this request.');}}
}class ConcreteHandler2 implements Handler {nextHandler?: Handler;handleRequest(request: Request): void {if (request.type === 'Type2') {console.log(`ConcreteHandler2 handled request: ${request.type}`);} else if (this.nextHandler) {this.nextHandler.handleRequest(request);} else {console.log('No handler found for this request.');}}
}// 使用示例
function setupChain(): Handler {const handler1 = new ConcreteHandler1();const handler2 = new ConcreteHandler2();// 构建责任链handler1.nextHandler = handler2;// 返回链头return handler1;
}// 创建请求对象
const request1 = new Request('Type1', 'Some Data');
const request2 = new Request('Type2', 'Other Data');
const request3 = new Request('Type3', 'More Data');// 创建并初始化责任链
const chain = setupChain();// 发送请求
chain.handleRequest(request1); // ConcreteHandler1 handled request: Type1
chain.handleRequest(request2); // ConcreteHandler2 handled request: Type2
chain.handleRequest(request3); // No handler found for this request.
  • 在这个示例中:Handler 是一个抽象接口,定义了处理请求的方法 handleRequest,以及指向下一位处理器的 nextHandler 属性
  • Request 类封装了请求的类型和数据
  • ConcreteHandler1ConcreteHandler2 是实现了 Handler 接口的具体处理器类,它们可以根据请求的类型来处理请求,或者将请求委托给链中的下一位处理器
  • setupChain 函数用于构建一个责任链,并返回链头(即第一个处理器)
  • 在客户端代码中,只需将请求发送给链头即可,无需关心请求的具体处理过程和由哪一具体处理器完成
  • 请求会沿着责任链自动传递,直到找到能够处理它的处理器

责任链模式优缺点


1 ) 优点

  • 降低了请求发送者和多个请求处理者之间的耦合度
  • 增强了系统的可扩展性,可以根据需要增加新的请求处理类
  • 增强了给对象指派职责的灵活性,当工作流程发生变化时,可以动态地改变处理者的顺序或增加新的处理者

2 )缺点

  • 性能问题
    • 对于比较长的责任链,当请求在链中传递时,会涉及到多个处理对象的依次调用
    • 这可能导致系统性能受到影响,特别是在处理大量请求时,每个请求都需要在链中遍历一遍,这会增加响应时间和资源消耗
  • 调试困难
    • 由于请求在链中传递,如果处理过程中出现问题,可能会难以定位具体是哪个处理者出现了问题
    • 调试时可能需要跟踪整个链的执行流程,增加了调试的复杂性和时间成本
  • 可能无法处理请求
    • 如果链中没有合适的处理者能够处理请求,或者链的配置有误,可能导致请求无法被正确处理
    • 这种情况下,需要确保链的完整性和正确性,以避免出现请求被忽略或处理不当的情况
  • 可能导致循环调用
    • 在某些情况下,如果责任链的配置不当,处理者之间可能存在循环引用,导致请求在链中无限循环传递,无法正常结束
    • 因此,在构建责任链时需要特别注意避免循环引用的发生

3 )总结

  • 尽管责任链模式存在一些缺点,但它仍然是一种非常有用的设计模式,特别是在需要将请求依次传递给多个处理者进行处理的场景中
  • 在使用责任链模式时,需要权衡其优缺点,并根据具体需求进行适当的调整和优化

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

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

相关文章

WinRAR再爆0 day漏洞,0 day漏洞该如何有效预防

WinRAR再爆0 day漏洞,已被利用超过4个月。 Winrar是一款免费的主流压缩文件解压软件,支持绝大部分压缩文件格式的解压,全球用户量超过5亿。Group-IB研究人员在分析DarkMe恶意软件时发现WinRAR在处理ZIP文件格式时的一个漏洞,漏洞…

iptables/ebtables学习笔记

目录 一、前言 二、Netfilter 构成 三、Netfilter 转发框架 四、Netfilter 与 iptables 五、Netfilter 与 ebtables 一、前言 Netfilter 是 Linux 内核的数据包处理框架,由 Rusty Russell 于 1998 年开发, 旨在改进以前的 ipchains(Lin…

实例解释遇到前端报错时如何排查问题

前端页面报错: 1、页面报错500,首先我们可以知道是服务端的问题,需要去看下服务端的报错信息: 2、首先我们查看下前端是否给后端传了id: 我们可以看到接口是把ID返回了,就需要再看下p_id是什么情况了。 3、我们再次请…

问题:Nand作为存储介质,读写出错

一、验证testchip的时候遇到的问题 格式化失败,经分析(协议分析仪上总线的数据),有两个原因:(1)Disk IO Cache层的实现有问题 (2)NAND存储介质的读写有问题。 二、LARK-FPGA遇到的问题 1. 问题1:无法格式化 格式化失败,无法格式化! 1.1 协议分析仪 Debug方法:PC端通…

计算机网络 虚拟局域网划分

一、实验内容 1、分别把交换机命名为SWA、SWB 2、划分虚拟局域网 valn ,并将端口静态划分到 vlan 中 划分vlan 方法一:在全局模式下划分vlan,在SWA交换机上创建三个vlan,分别为vlan2,vlan3,vlan4。 方…

飞驰云联入选金融信创生态实验室「金融信创优秀解决方案」

近日,由中国人民银行领导、中国金融电子化集团有限公司牵头组建的金融信创生态实验室发布了第三期金融信创优秀解决方案,Ftrans飞驰云联“文件数据传输解决方案”成功入选! 本次金融信创优秀解决方案遴选经方案征集、方案初审、专家评审等多环…

(2022级)成都工业学院数据库原理及应用实验三:数据定义语言DDL

唉,用爱发电连赞都没几个,博主感觉没有动力了 想要完整版的sql文件的同学们,点赞评论截图,发送到2923612607qq,com,我就会把sql文件以及如何导入sql文件到navicat的使用教程发给你的 基本上是无脑教程了,…

【线段树】2276. 统计区间中的整数数目

算法可以发掘本质,如: 一,若干师傅和徒弟互有好感,有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二,有无限多1X2和2X1的骨牌,某个棋盘若干格子坏了,如何在没有坏…

BJT 和 FET的知识点以及区别

一、晶体管的介绍 晶体管是一种三端半导体器件,它是一种用于大多数电子设备的有源器件。晶体管可根据需要用作绝缘体和导体。我们可以将晶体管用作开关和放大器。它可以与其他电路元件一起使用,并且能够放大电流和电压。我们可以将晶体管分为两种类型&am…

锐化空间滤波器--二阶微分图像增强(提高清晰度的另一种方式)

书上一阶微分的定义可以理解,毕竟这里不死数学上的曲线的概念,而是像素点上的曲线。所以,不同于数学的严格单调递增曲线的导数是大于等于零,这里的严格单调递增曲线,只能是大于零。 至于二阶微分的定义,就…

HarmonyOS实战开发-图片编辑、使用 TextArea 实现多文本输入

介绍 本示例使用 TextArea 实现多文本输入,使用 ohos.app.ability.common 依赖系统的图库引用,实现在相册中获取图片,使用 ohos.multimedia.image 生成pixelMap,使用pixelMap的scale(),crop(),rotate()接口…

idea 中运行spring boot 项目报 Command line is too long的解决办法。

Command line is too long 在这里选择edit configures 选择shrten command line , 选择 jar manifest 运行即可。

解决vue启动项目报错:npm ERR! Missing script: “serve“【详细清晰版】

目录 问题描述问题分析和解决情况一解决方法情况二(常见于vue3)解决方法情况三解决方法 问题描述 在启动vue项目时通常在控制台输入npm run serve 但是此时出现如下报错: npm ERR! Missing script: "serve" npm ERR! npm ERR! T…

Flask + MongoDB极简登录示例代码

基本原理 这段代码是一个使用Flask框架的简单登录和注册系统。它使用了Flask-PyMongo扩展来连接MongoDB数据库,Flask-Login扩展来处理用户认证。以下是代码的主要部分: 导入所需的库和模块。初始化Flask应用,配置MongoDB连接和Flask-Login。…

IJKPLAYER源码分析-iOS端显示

1 简介 1.1 EAGL(Embedded Apple Graphics Library) 与Android系统使用EGL连接OpenGL ES与原生窗口进行surface输出类似,iOS则用EAGL将CAEAGLLayer作为OpenGL ES输出目标。 与 Android EGL 不同的是,iOS EAGL 不会让应用直接向 BackendFrameBuffer 和 F…

KKVIEW远程远程访问家里电脑

远程访问家里电脑:简易指南与价值所在 在数字化时代,电脑已成为我们日常生活和工作中不可或缺的工具。有时,我们可能在外出时急需访问家中电脑里的某个文件或应用,这时,远程访问家里电脑就显得尤为重要。本文将简要介…

微服务-7 Docker

一、镜像、容器、仓库 容器是镜像的实例,仓库中存储着镜像。 二、镜像的操作 三、容器的操作 创建容器停止容器,查看后发现没有了(docker ps 默认只展示没有停止的) docker ps -a (可以展示运行中和停止的镜像)删除容器:(docker rm 不能删除…

【LeetCode刷题日记】1716

Hercy 想要为购买第一辆车存钱。他 每天 都往力扣银行里存钱。 最开始,他在周一的时候存入 1 块钱。从周二到周日,他每天都比前一天多存入 1 块钱。在接下来每一个周一,他都会比 前一个周一 多存入 1 块钱。 给你 n ,请你返回在第…

长短时记忆网络(LSTM)

1. 理解RNN及其局限性 基础知识:首先,你需要了解RNN的基本概念和工作原理,包括它是如何通过时间步处理序列数据的。局限性:掌握RNN面临的主要挑战,特别是梯度消失和梯度爆炸问题,以及这些问题为什么会影响…

提升写作效率:掌握ChatGPT论文写作技巧

ChatGPT无限次数:点击直达 html 提升写作效率:掌握ChatGPT论文写作技巧 在科技的快速发展下,人工智能技术已经逐渐渗透到各行各业中。在学术领域,论文写作是一项重要且耗时的工作,而ChatGPT这样的人工智能工具可以帮助研究人员…