毅四捕Go设计模式笔记——责任链模式

责任链模式(Chain of Responsibility Pattern)

为了解决什么问题?

责任链模式的目的是为了将请求的发送者和接收者解耦。它允许多个处理器都有机会处理请求,将这些处理器连接成一条链,并沿着这条链传递请求,直到有一个处理器处理它为止。

通过这种方式,发送者不需要知道谁是请求的接收者,同时可以动态地改变链中的成员。

怎么用代码实现?

下面是Java代码示例,先定义抽象处理器,以及具体的处理器实现:

/*** 抽象处理器*/
abstract class Handler {protected Handler successor;public void setSuccessor(Handler successor) {this.successor = successor;}public abstract void handleRequest(String request);
}/*** 处理器A*/
class ConcreteHandlerA extends Handler {@Overridepublic void handleRequest(String request) {if ("A".equals(request)) {System.out.println("ConcreteHandlerA handled the request.");} else if (successor != null) {successor.handleRequest(request);}}
}/*** 处理器B*/
class ConcreteHandlerB extends Handler {@Overridepublic void handleRequest(String request) {if ("B".equals(request)) {System.out.println("ConcreteHandlerB handled the request.");} else if (successor != null) {successor.handleRequest(request);}}
}

然后,在调用前编排好责任链,再处理具体的请求:

/*** 客户端代码*/
public class Client {public static void main(String[] args) {// 设置职责链上的处理对象Handler handlerA = new ConcreteHandlerA();Handler handlerB = new ConcreteHandlerB();handlerA.setSuccessor(handlerB);// 请求处理handlerA.handleRequest("A");handlerA.handleRequest("B");}
}

为什么可以解决这个问题?

责任链模式通过构建一条链来组织处理器,请求在链上传递,直到被处理。

因为请求发送者不需要知道具体的处理器,所以该模式降低了请求发送者与处理器之间的耦合度。同时,责任链模式提供了一种简单的方式来增加新的处理器或者重新排序现有处理器,提高了系统的灵活性和可扩展性。

责任链模式适用于哪些场景?

多个对象可以处理同一个请求时:可以使用责任链模式,客户端只需将请求发送到链上即可,无需关心请求的具体处理器。

动态指定处理对象集合:当在运行时需要改变处理请求的对象,或者不事先指定接收者时。

实施隐式接收链:当处理一个请求的处理不必显式地设定,而是每个处理器自己选择是否将请求传递给下一个处理器。

不明确特定请求的处理器:当你希望请求不被特定接收者直接处理,而是有多个对象中的一个来处理时。

多个对象决定如何处理请求:当多个对象可以处理请求,且具体处理器是在运行时自动确定时,如基于运行时条件动态决定处理器。

广播通信:当需要向所有的对象发出一个请求,而又不想显式指定接收者时,责任链可作为一种广播机制。

责任链模式在开源代码的实际应用案例有:

Java Servlet Filters:Servlet过滤器就是一种责任链模式的实现。每个过滤器可以决定是完成对请求的处理,还是将请求传递给责任链中的下一过滤器。

Logback中的拦截器链:在Logback这个日志框架中,日志事件可以经过多个拦截器进行处理,每个拦截器可以对事件进行加工,或者阻止事件继续传递。

Spring Security中的过滤器链:Spring Security使用责任链模式来处理安全过滤器,请求在通过多个安全过滤器链前行进,每个过滤器执行特定的安全检查。

Apache Camel路由器:Apache Camel使用责任链模式构建复杂的消息路由处理链,请求(消息)通过一系列处理器进行处理,每个处理器完成特定功能后可能将消息传递给下一个处理器。

责任链模式有哪些优点和缺点?

责任链模式提供一种将请求的发送者和接收者进行解耦的模式。它通过给多个对象处理请求的机会,增强了系统的灵活性,有助于代码的维护和扩展。

然而,责任链模式可能会导致请求不被处理(如果链没有被正确配置)以及性能问题(如果链较长或处理比较复杂)。

因此,责任链应当适用于预期请求会在链中被处理,并且处理器数量合理的情况下使用。

优点:

降低耦合度:它解耦了请求发送者和N个接收者之间的复杂关系,使得链中的对象不需要知道链的结构。因此,增加或删除处理器或者改变处理器顺序变得更加容易。

增强给定请求的处理器的灵活性:通过改变链内成员或者重新重新排序,可以动态地改变处理器间的关系。

增加新的请求处理类方便:扩展新的处理类不影响其他的类,符合开放-封闭原则。

缺点:

不能保证请求一定被接收:一个请求可能最终未被任何处理器对象处理,客户端也不会得到明确的反馈。

对链中请求处理器的遍历:如果链很长,请求的处理可能涉及多个处理对象,会增加处理延迟,并影响性能。

维护链可能需要额外开销:链的构建与维护可能需要消耗资源,特别是在动态改变链结构时。

责任链模式是一种强大的行为设计模式,通过解耦发送者和接收者,它提供了请求处理的灵活性和扩展性。然而,设计责任链时应当注意其可能带来的性能考量和处理的不确定性,适当的使用场景和良好的设计是确保该模式有效运用的关键。

———————————这是分割线———————————

欢迎添加博主vx深入交流:
博主微信

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

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

相关文章

Linux磁盘空间问题排查记录

问题 pip install时总提示OSError(28, ‘No space left on device’)或者ERROR: Could not install packages due to an OSError: [Errno 28] No space left on device 分析 很明显,磁盘空间不足。尝试了以下方法,没有解决问题: 清理pip缓…

给现有rabbitmq集群添加rabbitmq节点

现有的:10.2.59.216 rabbit-node1 10.2.59.217 rabbit-node2 新增 10.2.59.199 rabbit-node3 1、分别到官网下载erlang、rabbitmq安装包,我得版本跟现有集群保持一致。 erlang安装包:otp_src_22.0.tar.gz rabbitmq安装包&#xff1…

详解App Inventor 2 中的文件作用域(作用范围):App、程序包、缓存、兼容、私有、共享

本文内容来自中文网文档“文件管理器”组件部分,详细介绍了每一种文件作用域的特点及用法。 下面是每种作用域类型的简述: App [推荐] :Android 2.2及更高版本上文件将从应用程序特定存储中读取和写入,在 Android 早期版本上&…

STM32—DMA直接存储器访问详解

DMA——直接存储器访问 DMA:Data Memory Access, 直接存储器访问。 DMA和我们之前学过的串口、GPIO都是类似的,都是STM32中的一个外设。串口是用来发送通信数据的,而DMA则是用来把数据从一个地方搬到另一个地方,而且不占用CPU。…

Arthas排查工具

简介 | arthas (aliyun.com) 在线安装 #下载jar包 curl -O https://arthas.aliyun.com/arthas-boot.jar#启动会先检测虚拟机进程,如果没有启动失败(idea) java -jar arthas-boot.jar linux安装与window一样

flask毕业设计选题管理系统python+django_96r19

本系统选择编程语言。Pymysql是封装了MySQL驱动的Python驱动一个能使Python连接到MySQL的库。Python语言官方规范访问数据库的统一接口规范(Python DB-API),防止在使用不同数据库时,由于底层数据库技术不同造成接口程序紊乱的问题。通过本次系统设计可以…

【Spring高级】Spring Boot启动过程

目录 SpringApplication new 分析源码分析步骤演示primarySources和Sources应用类型webApplicationTypesetInitializers设置容器初始化器setListeners设置监听器主类推断 SpringApplication run 分析主要步骤步骤演示事件发布容器相关执行 runner准备EnvironmentEnvironmentPos…

时间序列分析 #ARMA模型的识别与参数估计 #R语言

掌握ARMA模型的识别和参数估计。 原始数据在文末!!! 练习1、 根据某1915-2004年澳大利亚每年与枪支有关的凶杀案死亡率(每10万人)数据(题目1数据.txt),求: 第1小题&…

C# Solidworks二次开发:模型中实体Entity相关操作API详解

大家好,今天要讲的一些API是关于实体的相关API。 在开发的过程,很多地方会涉及到实体的相关操作,比如通过实体选中节点。下面就直接开始介绍API: (1)第一个API为Select4,这个API的含义为选中一…

微信小程序中调取小程序实现报错:提示 开发版小程序已过期,请在开发者工具中重新扫码的 解决方案

出现的问题: 解决方法: 将envVersion: develop,开发版切换为正式版 envVersion: release,wx.navigateToMiniProgram({appId:res.data.appId,path: res.data.prePayTn,extraData: {foo: bar,miniProgramOrgId:res.data.miniProgramOrgId,orderId: res.d…

css设置文字撑满盒子

效果如上&#xff1a; <div style"width: 250px;background-color:red;text-align-last:justify;word-break: keep-all;">为中国崛起而读书</div>

Python编写一个抽奖小程序,新手入门案例,简单易上手!

“ 本篇文章将以简明易懂的方式引导小白通过Python编写一个简单的抽奖小程序&#xff0c;无需太多的编程经验。通过本文&#xff0c;将学习如何使用Python内置的随机模块实现随机抽奖&#xff0c;以及如何利用列表等基本数据结构来管理和操作参与抽奖的人员名单。无论你是Pytho…

贪心算法:柠檬水找零

题目链接&#xff1a;860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 收的钱只能是5、10、20美元&#xff0c;分类讨论&#xff1a;收5美元无需找零&#xff1b;收10美元找零5元&#xff1b;收20美元找零15美元。其中对于找零15美元的方案有两种&#xff0c;此处涉及…

设计模式-外观模式(Facade)

1. 概念 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用于访问子系统中的一群接口。外观模式的主要目的是隐藏系统的复杂性&#xff0c;通过定义一个高层级的接口&#xff0c;使得子系统更容易被使用。…

房屋鉴定研究院报告系统

一、项目背景与意义 随着城市化进程的加速和房地产市场的蓬勃发展&#xff0c;房屋安全问题日益受到社会各界的广泛关注。房屋鉴定作为确保房屋安全的重要手段&#xff0c;对于保障人民群众生命财产安全、维护社会稳定具有重要意义。然而&#xff0c;传统的房屋鉴定方式存在诸…

webpack-loader的使用

引入css后执行打包命令 "build": "npx webpack --config wk.config.js"发现报错&#xff1a; webpack默认只能处理js其他的像css,图片都需要借助loader来处理 css-loader loader可以用于对模块的源代码进行转换&#xff0c;可以把css看成一个模块&…

并发学习27--多线程 Tomcat 线程池

Tomcat连接器的线程池 socketProcessor也是个线程 Executor处理线程是按照JDK线程池方法处理&#xff0c;优先选用核心线程&#xff0c;再用救急线程&#xff0c;再去阻塞队列&#xff0c;最后采用拒绝策略。 Tomcat线程池与ThreadExecutorPool的区别 Tomcat中的配置 Tomcat …

kafka快速入门+应用

Kafka, 构建TB级异步消息系统 1.快速入门 1.1 阻塞队列 在生产线程 和 消费线程 之间起到了 &#xff0c; 缓冲作用&#xff0c;即避免CPU 资源被浪费掉 BlockingQueue 解决 线程通信 的问题阻塞方法 put 、 take生产者、消费者 模式 生产者&#xff1a;产生数据的线程…

Word中图表题注样式自动编号

需求 在写论文的时候&#xff0c;希望图表题注是下面的样子&#xff0c;其中图号表示为&#xff1a;章的编号-本章中图的序号&#xff0c;而且都是小写数字。 网上找的方法大多是使用 “插入题注” 来插入&#xff0c;此时章的编号是大写的&#xff0c;如“图一-1”。然后再通…

Web前端-HTML

黑马程序员JavaWeb开发教程 一、初识web前端 1、 标准也称为网页标准&#xff0c;由一系列的标准组成&#xff0c;大部分由W3C负责指定 2、 三个部分组成 HTML&#xff1a;负责网页的结构&#xff08;页面元素和内容&#xff09;CSS&#xff1a;负责网页的表现&#xff08;页…