当前位置: 首页 > news >正文

【设计模式】责任链模式的介绍及其应用

责任链的介绍

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

在责任链模式当中,客户端只用执行一次流程开始的请求便不再需要参与到流程执行当中,责任链上的流程便能够自己一直往下执行,客户端同样也并不关心执行流程细节,从而实现与流程之间的解耦。

责任链的结构

责任链模式需要有以下几个角色:

  • 抽象处理器(Handler):处理器抽象接口,定义了处理请求的方法和执行下一步处理的处理器
  • 具体处理器(ConcreteHandler):执行请求的具体实现,先根据请求执行处理逻辑,完成之后将请求交给下一个处理器执行
  • 调用者:调用者通过创建处理器并将请求交给处理器进行处理

Java实现

Context是全部参数,用于在各个处理器中流转。

@Data
@Builder
public class Context {private String name;private String type;
}

Handler抽象的处理器,定义了执行和判断是否需要执行的接口。

public interface Handler {void execute(Context context, HandlerChain chain);default boolean skip(Context context) {return false;}
}

NameHandler用来处理参数中的name属性

@AutoService(Handler.class)
public class NameHandler implements Handler {@Overridepublic void execute(Context context, HandlerChain chain) {System.out.println("name: " + context.getName());chain.execute(context);}@Overridepublic boolean skip(Context context) {if ("name1".equals(context.getName())) {return true;}return false;}
}

TypeHandler用来处理参数中的type属性

@AutoService(Handler.class)
public class TypeHandler implements Handler {@Overridepublic void execute(Context context, HandlerChain chain) {System.out.println("type: " + context.getType());chain.execute(context);}
}

HandlerChain用于封装处理器链条,提供执行入口。

public class HandlerChain {private int index;private final List<Handler> handlers;HandlerChain(List<Handler> handlers) {this.handlers = handlers;}public void execute(Context context) {if (this.index < handlers.size()) {Handler handler = handlers.get(this.index++);boolean skip = handler.skip(context);if (skip) {this.execute(context);}else {handler.execute(context, this);}}}}

测试效果

public class ChainTest {public static void main(String[] args) {ServiceLoader<Handler> serviceLoader = ServiceLoader.load(Handler.class);List<Handler> handlers = StreamSupport.stream(serviceLoader.spliterator(), false).collect(Collectors.toList());HandlerChain handlerChain = new HandlerChain(handlers);Context context = Context.builder().name("name").type("type").build();handlerChain.execute(context);HandlerChain handlerChain1 = new HandlerChain(handlers);Context context1 = Context.builder().name("name1").type("type1").build();handlerChain1.execute(context1);}
}

控制台输出:

name: name
type: type
type: type1

name属性是name1的context,是不需要NameHandler处理的。

在这里插入图片描述

相关文章:

【设计模式】责任链模式的介绍及其应用

责任链的介绍 责任链模式是一种对象的行为模式。在责任链模式里&#xff0c;很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递&#xff0c;直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求&a…...

一些思考关于行业,关于方向,关于人生路线

一些碎碎念 选择与视角工程与科研平台与信息敢问路在何方 选择与视角 两年前的秋招时几乎速通了出现在学校招聘会上的几乎出现的每一个offer&#xff0c;那也是我人生第一次收获到如此多的肯定与选择&#xff0c;为此我在b站上上传了一期就业解读&#xff0c;作为一个冷门到几…...

fbx sdk的使用介绍

我们平时需要围绕fbx写一些小工具&#xff0c;虽说使用ascii格式的fbx可以直接进行字符串解析&#xff0c;并且网上也有一些基于ascii解析的开源库&#xff0c;但在制作一些通用的工具时&#xff0c;使用fbx sdk进行编写肯定是最好的。 1.下载fbx sdk和cmake 要用cmake生成vi…...

mvvm模式

mvvm是Model-View-ViewModel的缩写&#xff0c;是前端的一种架构模式 M - Model&#xff0c;模型 对应data数据 V - View&#xff0c;视图 对应用户界面&#xff0c;DOM元素 VM - ViewModel&#xff0c;视图模型 对应vue实例对象&#xff0c;是连接model和view的桥梁 …...

Spring/SpringBoot常用注解总结

为什么要写这篇文章&#xff1f; 最近看到网上有一篇关于 SpringBoot 常用注解的文章被转载的比较多&#xff0c;我看了文章内容之后属实觉得质量有点低&#xff0c;并且有点会误导没有太多实际使用经验的人&#xff08;这些人又占据了大多数&#xff09;。所以&#xff0c;自…...

2023 年第八届数维杯大学生数学建模挑战赛 B 题 节能列车运行控制优化策略

在城市交通电气化进程快速推进的同时&#xff0c;与之相应的能耗增长和负面效应也 在迅速增加。城市轨道交通中的快速增长的能耗给城轨交通的可持续性发展带来 负担。2018 年&#xff0c;北京、上海、广州地铁负荷占全市总负荷的 1.5%-2.5%,成为了 城市电网的最大单体负荷[1]。…...

【Swift】 NSButton的用法和示例

NSButton是macOS开发中常用的控件&#xff0c;用于创建按钮。它有许多用法和需要注意的事项&#xff0c;下面介绍其中的一些。 1. 创建按钮&#xff1a;使用init(frame:)或init(title:action:)初始化按钮 let button NSButton(frame: NSRect(x: 0, y: 0, width: 100, height…...

2023什么蓝牙耳机好?经销商盘点新手必入蓝牙耳机品牌

蓝牙耳机是除手机外我们使用频率最高的数码产品&#xff0c;我做蓝牙耳机经销商五年来&#xff0c;对各个品牌都有深入了解。近期看到很多新手们咨询什么蓝牙耳机好&#xff0c;我给大家盘点一下新手必看的五大蓝牙耳机品牌。 1.JEET Air 2蓝牙耳机 推荐理由&#xff1a;专为舒…...

MySQL基础(二十)MySQL的数据目录

1. MySQL8的主要目录结构 find / -name mysql1.1 数据库文件的存放路径 show variables like datadir; # /var/lib/mysql/1.2 相关命令目录 相关命令目录&#xff1a;/usr/bin 和/usr/sbin。 1.3 配置文件目录 配置文件目录&#xff1a;/usr/share/mysql-8.0&#xff08;命…...

低代码行业未来如何?大家都真的看好低代码开发吗?

低代码行业未来如何&#xff1f;大家都真的看好低代码开发吗&#xff1f; 是否一定需要开发人员&#xff1f;低代码和无代码平台会取代传统编程吗&#xff1f;低代码/无代码真的是未来吗&#xff1f; 无疑是需要且重要的。今天就来解答为什么低/零代码工具越来越受欢迎&#xf…...

mac m2芯片 安装 brew 和cocoapods

Homebrew的安装 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 这里可能会失败&#xff0c;如 git clone 时候报错 error: RPC failed; curl 92 HTTP/2 stream 5 was not closed cleanly before end of the underlyi…...

SingleR --细胞注释

文章目录 briefExample使用内置的 references使用其他注释好的数据集作为 reference singleR还提供了注释诊断的方法 brief Example The celldex package provides access to several reference datasets (mostly derived from bulk RNA-seq or microarray data)。 The Human…...

【结构与算法】—— 游戏概率常用算法整理 | 游戏中的常见概率设计分析

&#x1f4e2;博客主页&#xff1a;肩匣与橘&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由肩匣与橘编写&#xff0c;首发于CSDN&#x1f649;&#x1f4e2;生活依旧是美好而又温柔的&#xff0c;你也是✨ …...

WebRTC系列-适配GPUImage及其他视频处理改造

文章目录 1. GPUImage 的一些改动1.1 GPUImage数据输入源1.1 GPUImage数据输出源2.WebRTC摄像头采集类改造GPUImage使用OpenGL提供了很多的图像处理算法,包括最常用的美颜处理、水印等功能,这些基本的功能如何添加到WebRTC中,本文以美颜为例子,叙述主要的改造流程;同时也适…...

day43—选择题

文章目录 1.A,B两台机器都正常工作,B机器未监听任何端口.如果A机器向B机器80端口发送SYN包,会收到何种类型的回包&#xff08;D&#xff09;2.下列哪个IP地址可以分配给一台计算机&#xff08;D&#xff09;3.以下哪个ip不和10.11.12.91/28处于同一个子网&#xff08;D&#xf…...

<<和>>操作符、取地址重载、const关键字

文章目录 自定义类型<<和>>重载const关键字取地址重载&#xff08;类的默认构造函数&#xff09; 自定义类型<<和>>重载 在内置类型中&#xff0c;<<和>>可以自动识别 在自定义类型冲&#xff0c;运算符重载&#xff0c;<<和>&…...

数学模型,如何计算概率?

既然是数学模型,那应该如何计算呢? 最简单的方法,当然就是用统计学的方法去计算了,简单说来,就是靠输入的上下文进行统计,计算出后续词语的概率,比如「你吃了晚饭了吗」,「你吃了」后面按照概率,名词如「饭」或「晚饭」等概率更高,而不太可能是动词,如「睡」「睡觉…...

【Ehcache技术专题】「入门到精通」带你一起从零基础进行分析和开发Ehcache框架的实战指南(Spring整合ehcache)

带你一起从零基础进行分析和开发Ehcache框架的实战指南&#xff08;Spring整合ehcache&#xff09; 回顾一下Ehcache主要的特性 Spring框架所支持的第三方缓存Spring Cache的实现方式Spring Cache基本准备工作定义Ehcache配置文件启用Spring-CacheXML风格的xml代码 JavaConfig注…...

合肥市2023年度高校毕业生“双千培养工程”培训项目学员招募公告

为贯彻落实人社部实施促进高校毕业生等青年就业创业推进计划要求&#xff0c;提升高校毕业生就业技能&#xff0c;拟开展高校毕业生“双千培养工程”培训项目。根据工作计划安排&#xff0c;现面向高校和社会招募学员参加培训&#xff0c;培训方向为大数据应用、PythonAI人工智…...

重写Properties类,实现对properties文件的有序读写,数据追加,解决中文乱码

前言 *.properties文件&#xff0c;是 Java 支持的一种配置文件类型&#xff0c;并且 Java 提供了 properties 类来读取 properties 文件中的信息。文件中以键值对 "键值"的形式&#xff0c;存储工程中会多次重复使用的配置信息&#xff0c;通过“Properties”类来读…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂&#xff0c;难以孤立地评估各个组件的贡献&#xff0c;传统的检索方法在处理复杂推理任务时可能不够有效&#xff0c;特别是在需要理解实体间关系或多跳知识的情况下。先说结论&#xff0c;看完后感觉这个框架性能上不会比Grap…...