毅四捕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一样

利用SOCKS5代理和代理IP提升网络安全与匿名性

一、引言 随着网络技术的迅猛发展,数据安全和隐私保护已成为业界关注的热点。企业和个人用户越来越依赖于各种网络技术来保护敏感信息免受未授权访问。本文将探讨SOCKS5代理、代理IP以及HTTP协议在提升网络安全和匿名性方面的作用和实践应用。 二、基础技术概述 2.…

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>

Objective-C网络请求开发的高效实现方法与技巧

前言 在移动应用开发中&#xff0c;网络请求是一项至关重要的技术。Objective-C作为iOS平台的主要开发语言之一&#xff0c;拥有丰富的网络请求开发工具和技术。本文将介绍如何利用Objective-C语言实现高效的网络请求&#xff0c;以及一些实用的技巧和方法。 1.Objective-C技…

以太坊源码阅读01

正所谓区块链&#xff0c;怎能不熟悉区块的数据结构呢&#xff1f;区块的结构体被保存在core/types/block.go文件中&#xff0c;下面是我截取出来的&#xff1a; type Block struct {header *Headeruncles []*Headertransactions Transactionswithdrawals Withdr…

干货分享|TensorFlow构建神经网络

MNIST数据集前面章节已经多次遇到过&#xff0c;这里直接引用&#xff0c;并使用TensorFlow构建神经网络模型进行训练。下面举例说明如何构建简单的神经网络并训练。 【例15-33】 TensorFlow构建神经网络训练MNIST数据集。 输入如下代码&#xff1a; # 构建简单模型&#xf…

蓝桥杯单片机超声波示例通常涉及使用超声波模块进行测距。下面是一个基于51单片机的超声波测距示例代码:

蓝桥杯单片机超声波示例通常涉及使用超声波模块进行测距。下面是一个基于51单片机的超声波测距示例代码&#xff1a; #include <reg52.h> #include <intrins.h>sbit Trig P1^0; // 定义超声波发送引脚 sbit Echo P1^1; // 定义超声波接收引脚unsigned int Tim…

进程线程的关系

举个例子 滑稽老师吃100只鸡 如何加快滑稽老师吃鸡的效率&#xff1f;&#xff1f; 有一个方案&#xff0c;搞两个房间&#xff0c;两个滑稽老师 一个滑稽吃50只鸡&#xff0c;速度一定会大幅度增加 多进程的方案 创建新的进程 就需要申请更多的资源&#xff08;房间和…

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;此处涉及…

mysqlySQL中启用慢查询日志并设置阈值

要在MySQL中启用慢查询日志并设置阈值&#xff0c;可以按照以下步骤进行&#xff1a; 编辑MySQL配置文件&#xff1a;打开MySQL的配置文件&#xff08;通常是my.cnf或my.ini&#xff09;&#xff0c;在[mysqld]部分添加或修改以下行来启用慢查询日志并设置阈值&#xff1a; s…