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

设计模式简述(十)责任链模式

责任链模式

  • 描述
    • 基本使用
    • 使用

描述

如果一个请求要经过多个类似或相关处理器的处理。
可以考虑将这些处理器添加到一个链上,让请求逐个经过这些处理器进行处理。

通常,在一个业务场景下会对整个责任链进行初始化,确定这个链上有哪些Handler

关于一个handler处理请求后,请求如何流转通常有几种处理方式:

  • handler有匹配条件
    • 一旦匹配一个handler完成处理后直接返回 后续handler 不会处理i请求
    • 无论是否匹配都执行完整个责任链
  • handler没有匹配条件
    • 这种没有匹配条件的链通常是执行整个责任链

基本使用

这里以有条件匹配,只执行一个handler后就返回的方式举例
匹配的条件通常包含在请求参数中,用于与每个Handler内条件匹配

这里参数就简单定义一个类,不提抽象层了

  • 请求参数
public class HandleRequest {private String type;private Object data;public String getType() {return type;}public void setType(String type) {this.type = type;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}@Overridepublic String toString() {return "HandleRequest{" +"type='" + type + '\'' +", data=" + data +'}';}
}
  • 抽象Handler
public abstract class AbstractHandler {private AbstractHandler nextHandler;public final void handleRequest(HandleRequest request) {if (Objects.equals(handleType(), request.getType())) {this.handle(request);} else {if (this.nextHandler != null) {this.nextHandler.handleRequest(request);} else {System.out.println("请求未匹配到Handler...");}}}public void setNext(AbstractHandler handler) {this.nextHandler = handler;}protected abstract String handleType();protected abstract void handle(HandleRequest request);
}
  • 具体Handler
public class HandlerA extends AbstractHandler {@Overrideprotected String handleType() {return "typeA";}@Overrideprotected void handle(HandleRequest request) {System.out.println("HandlerA 处理请求: " + request);}
}public class HandlerB extends AbstractHandler {@Overrideprotected String handleType() {return "typeB";}@Overrideprotected void handle(HandleRequest request) {System.out.println("HandlerB 处理请求: " + request);}
}

使用

在实际使用中,可以将责任链的初始化动作放到具体业务类中,返回第一个Handler给调用者即可
然后将请求委托给责任链。

这里就直接在调用方 进行初始化

public class Sample {public static void main(String[] args) {AbstractHandler handlerA = new HandlerA();AbstractHandler handlerB = new HandlerB();handlerA.setNext(handlerB);HandleRequest request = new HandleRequest();request.setType("typeB");request.setData("data.....");handlerA.handleRequest(request);}
}

相关文章:

设计模式简述(十)责任链模式

责任链模式 描述基本使用使用 描述 如果一个请求要经过多个类似或相关处理器的处理。 可以考虑将这些处理器添加到一个链上,让请求逐个经过这些处理器进行处理。 通常,在一个业务场景下会对整个责任链进行初始化,确定这个链上有哪些Handler…...

分组(二分查找)

#include <bits/stdc.h> using namespace std; const int N1e55; int a[N]; int n,k;bool f(int x){int num1;int ma[1];for(int i2;i<n;i){if(a[i]-m>x){ // 当前元素加入当前组会超过极差 xnum; // 新开一组ma[i]; // 新组的最小值设为当前元素}}r…...

vue的主要核心文件介绍

1.package.json 查看依赖包的版本 项目基本信息记录 项目标识&#xff1a;记录项目名称&#xff08;name 字段&#xff09;、版本号&#xff08;version 字段&#xff09;、描述&#xff08;description 字段&#xff09;等基础信息&#xff0c;方便识别和管理项目。例如&…...

从奖励到最优决策:动作价值函数与价值学习

从奖励到最优决策&#xff1a;动作价值函数与价值学习 价值学习动作价值函数对 U t U_t Ut​求期望得到动作价值函数动作价值函数的意义最优动作价值函数(Optimal Action-Value Function)如何理解 Q ∗ Q^* Q∗函数 价值学习的基本思想Deep Q-Network(DQN)DQN玩游戏的具体流程如…...

DApp实战篇:先用前端起个项目

前言 本篇将使用vue框架quasar起一个项目,为了防止大家不会使用quasar,本篇详细讲解一下quasar如何使用。 quasar 如果你不想深入了解quasar,其实你完全可以将quasar当成一个vue的组件库即可,它是一个类谷歌Material风格的UI组件库,但同时它又是一个基于vue的强大框架。…...

论文阅读11——V2V-LLM:采用多模式大型语言模型的车对车协同自动驾驶

原文地址&#xff1a; 2502.09980https://arxiv.org/pdf/2502.09980 论文翻译&#xff1a; V2V-LLM: Vehicle-to-Vehicle Cooperative Autonomous Driving with Multi-Modal Large Language Models V2V-LLM&#xff1a;采用多模式大型语言模型的车对车协同自动驾驶 摘要&#…...

NLP 梳理01 — 文本预处理和分词

文章目录 一、说明二、文本预处理概述2.1 为什么要预处理文本&#xff1f;2.2 文本预处理的常见步骤2.3 什么是令牌化&#xff1f;2.4 为什么令牌化很重要&#xff1f; 三、分词类型四、用于分词化的工具和库五、实际实施六、编写函数以对文本进行标记七、结论 一、说明 本文总…...

Windows11 优雅的停止更新、禁止更新

网上有很多关闭自动更新的方法&#xff0c;改注册表、修改组策略编辑器、禁用Windows Update等等&#xff0c;大同小异&#xff0c;但最后奏效的寥寥无几&#xff0c;今天给大家带来另一种关闭win11自动更新的方法&#xff0c;亲测有效&#xff01; 1、winR 打开运行窗口&…...

Kafka 中的 offset 提交问题

手动提交和自动提交 我们来一次性理清楚&#xff1a;Kafka 中的自动提交 vs 手动提交&#xff0c;到底区别在哪&#xff0c;怎么用&#xff0c;什么场景适合用哪个&#x1f447; &#x1f9e0; 一句话总结 ✅ 自动提交&#xff1a;Kafka 每隔一段时间自动提交 offset ✅ 手动…...

PowerBI窗口函数与视觉计算

文章目录 一、 窗口函数1.1 OFFSET&#xff08;动态查询、求连续值&#xff09;1.1.1 不使用orderBy1.1.2 使用orderBy1.1.3 统计连续值的最大出现次数&#xff08;待补&#xff09; 1.2 INDEX&#xff08;静态查询&#xff09;1.3 WINDOW&#xff08;滚动求和、累计求和、帕累…...

代码随想录算法训练营Day22

回溯知识 力扣77.组合【medium】 一、回溯知识 1、定义 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 2、回溯法的效率 回溯的本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案…...

几种常见的HTTP方法之GET和POST

如大家所了解的&#xff0c;每条 HTTP 请求报文都必须包含一个请求方法&#xff0c;这个方法会告诉服务器要执行什么操作&#xff08;例如获取一个 Web 页面、运行一个网关程序、删除一个文件等&#xff09;。常见的几种 HTTP 方法如下&#xff1a; GET&#xff1a; 请求指定的…...

Nginx之https重定向为http

为了将Nginx中443端口的请求重定向到80端口&#xff0c;你可以按照以下步骤进行操作&#xff1a; ‌确认Nginx已经正确安装并运行‌&#xff1a; 确保Nginx服务已经在你的系统上安装并运行。你可以通过运行以下命令来检查Nginx的状态&#xff08;具体命令可能因操作系统而异&a…...

落地DevOps文化:运维变革的正确打开方式

落地DevOps文化:运维变革的正确打开方式 DevOps,这个近年来被谈论得沸沸扬扬的概念,是企业数字化转型的一把钥匙。然而,很多公司虽然喊着“要上DevOps”,却苦于如何真正落地。而DevOps不仅仅是技术工具的堆砌,更是一种文化的重塑。从我的经历来看,DevOps实施的核心在于…...

《C++后端开发最全面试题-从入门到Offer》目录

当今科技行业对C++开发者的需求持续高涨,从金融科技到游戏开发,从嵌入式系统到高性能计算,C++凭借其卓越的性能和灵活性始终占据着关键地位。然而,成为一名优秀的C++工程师并非易事,不仅需要扎实的语言基础,还要掌握现代C++特性、设计模式、性能优化技巧以及各种工业级开…...

24统计建模国奖论文写作框架2(机器学习+自然语言处理类)(附原文《高校负面舆情成因与演化路径研究》)

一、引言 研究背景及意义 文献综述 研究内容与创新点 二、高校负面舆情热点现状分析 案例数据的获取与处理 高效负面舆情热点词频分析 高效负面舆情热点变化趋势分析 三、高校负面舆情成因分析 高校负面舆情变量的选取与赋值 基于QCA方法的高校负面舆情成因分析 四、…...

论文阅读笔记——Deformable Radial Kernel Splatting

DRK 论文 DRK&#xff08;可变形径向核&#xff09;的核心创新正是通过极坐标参数化与切平面投影&#xff0c;对传统3D高斯泼溅&#xff08;3D-GS&#xff09;进行了多维度的优化。 传统 3DGS 依赖径向对称的高斯核&#xff0c;只能表示平滑、各向同性的形状&#xff08;球体、…...

网络编程—TCP/IP模型(IP协议)

上篇文章&#xff1a; 网络编程—TCP/IP模型&#xff08;TCP协议&#xff09;https://blog.csdn.net/sniper_fandc/article/details/147011479?fromshareblogdetail&sharetypeblogdetail&sharerId147011479&sharereferPC&sharesourcesniper_fandc&sharef…...

Android NDK C/C++交叉编译脚本

以下是 ​​Android (arm64-v8a) 交叉编译 C/C 项目的完整脚本模板​​&#xff0c;基于 NDK 工具链&#xff0c;支持自定义源文件编译为静态库/动态库/可执行文件&#xff1a; 1. 基础交叉编译脚本 (build_android.sh) bash 复制 #!/bin/bash# Android 交叉编译脚本 (arm64-…...

IS-IS-单区域的配置

一、IS-IS的概念 IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是一种‌链路状态路由协议‌&#xff0c;最初设计用于‌OSI&#xff08;Open Systems Interconnection&#xff09;参考模型‌的网络层&#xff08;CL…...

Java EE期末总结(第四章)

目录 一、ORM框架 二、MyBatis与Hibernate 1、 概念与设计理念 2、SQL 控制 3、学习成本 4、开发效率 三、MyBatisAPI 1、SqlSessionFactoryBuilder 2、SqlSessionFactory 3、SqlSession 四、MyBatis配置 1、核心依赖与日志依赖 2、建立.XML映射文件 3、建立映射…...

Kafka 的选举机制

Kafka 的选举机制在 Zookeeper 模式 和 KRaft 模式 下有所不同&#xff0c;主要体现在 领导选举 和 集群元数据管理 的方式上。下面详细介绍这两种模式下 Kafka 如何进行选举机制。 1. Zookeeper 模式下的选举机制 在早期的 Kafka 架构中&#xff0c;集群的元数据管理和选举机…...

FreeRTOS移植笔记:让操作系统在你的硬件上跑起来

一、为什么需要移植&#xff1f; FreeRTOS就像一套"操作系统积木"&#xff0c;但不同硬件平台&#xff08;如STM32、ESP32、AVR等&#xff09;的CPU架构和外设差异大&#xff0c;需要针对目标硬件做适配配置。移植工作就是让FreeRTOS能正确管理你的硬件资源。 二、…...

设计模式简述(十二)策略模式

策略模式 描述基本使用使用传统策略模式的缺陷以及规避方法 枚举策略描述基本使用使用 描述 定义一组策略&#xff0c;并将其封装起来到一个策略上下文中。 由调用者决定应该使用哪种策略&#xff0c;并且可以动态替换 基本使用 定义策略接口 public interface IStrategy {…...

如何在idea中快速搭建一个Spring Boot项目?

文章目录 前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热启动&#xff08;热部署&#xff09;结语 前言 Spring Boot 凭借其便捷的开发特性&#xff0c;极大提升了开发效率&#xff0c;为 Java 开发工作带来诸多便利。许多大伙伴希望快速…...

【注解简化配置的原理是什么】

注解&#xff08;Annotation&#xff09;简化配置的核心原理是将原本分散在外部文件&#xff08;如XML、properties&#xff09;中的元数据直接内嵌到代码中&#xff0c;通过声明式编程让框架或工具自动处理这些元数据&#xff0c;从而减少手动配置的复杂度。以下是其实现原理的…...

Livox-Mid-70雷达使用------livox_mapping建图

1.ubuntu20.04 和Livox mid 70 的IP设置 连接好Livox-Mid-70雷达,然后进行局域网配置 1.1 Livox mid 70的IP是已知的&#xff0c;即192.168.1.1XX, XX表示mid 70广播码的后两位 1.2 ubuntu 20.04的IP设置 a.查看本机IP名 ifconfig b.设置本机IP地址 sudo ifconfig enx00e04…...

Django中使用不同种类缓存的完整案例

Django中使用不同种类缓存的完整案例 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 Django中使用不同种类缓存的完整案例步骤1:设置Django项目步骤2:设置URL路由步骤3:视图级别…...

代码随想录算法训练营Day32| 完全背包问题(二维数组 滚动数组)、LeetCode 518 零钱兑换 II、377 组合总数 IV、爬楼梯(进阶)

理论基础 完全背包问题 在完全背包问题中&#xff0c;每种物品都有无限个&#xff0c;我们可以选择任意个数&#xff08;包括不选&#xff09;&#xff0c;放入一个容量为 W W W 的背包中。我们希望在不超过容量的情况下&#xff0c;最大化背包内物品的总价值。 完全背包&a…...

Django SaaS案例:构建一个多租户博客应用

Django SaaS案例:构建一个多租户博客应用 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 Django SaaS案例:构建一个多租户博客应用如果你正在从事一个SaaS(软件即服务)项目或一…...

静态库与动态库

静态库&#xff08;Static Library&#xff09; 定义&#xff1a;静态库&#xff08;如 .a 文件或 .lib 文件&#xff09;是编译时直接链接到可执行文件中的库。其代码和数据会被完整复制到最终的可执行文件中。 特点&#xff1a; 独立部署&#xff1a;无需依赖外部库文件。 …...

优选算法的妙思之流:分治——归并专题

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、归并排序 二、例题讲解 2.1. 排序数组 2.2. 交易逆序对的总数 2.3. 计算右侧小于当前元素的个数 2.4. 翻转对 一、归并排序 归并排序也是采用了分治的思想&#xff0c;将数组划分为多个长度为1的子…...

PDFBox渲染生成pdf文档

使用PDFBox可以渲染生成pdf文档&#xff0c;并且自定义程度高&#xff0c;只是比较麻烦&#xff0c;pdf的内容位置都需要手动设置x&#xff08;横向&#xff09;和y&#xff08;纵向&#xff09;绝对位置&#xff0c;但是每个企业的单据都是不一样的&#xff0c;一般来说都会设…...

flutter dio网络请求与json数据解析

在Flutter中&#xff0c;Dio 是一个功能强大且易于使用的网络请求库&#xff0c;用于处理HTTP请求和响应。与 http 包相比&#xff0c;Dio 提供了更多高级功能&#xff0c;例如拦截器、文件上传/下载、请求取消等。结合 json_serializable 或手动解析 JSON 数据&#xff0c;可以…...

7. RabbitMQ 消息队列——延时队列(Spring Boot + 安装message_exchange“延迟插件“ 的详细配置说明)的详细讲解

7. RabbitMQ 消息队列——延时队列(Spring Boot 安装message_exchange"延迟插件" 的详细配置说明)的详细讲解 文章目录 7. RabbitMQ 消息队列——延时队列(Spring Boot 安装message_exchange"延迟插件" 的详细配置说明)的详细讲解1. RabbitMQ 延时队列概…...

使用 MyBatis-Plus 实现高效的 Spring Boot 数据访问层

在开发 Spring Boot 应用时&#xff0c;数据访问是不可或缺的部分。为了提高开发效率并减少样板代码&#xff0c;MyBatis-Plus 提供了强大的功能&#xff0c;能够简化与数据库交互的操作。本文将详细介绍如何在 Spring Boot 中使用 MyBatis-Plus&#xff0c;并结合具体代码示例…...

Linux学习笔记——零基础详解:什么是Bootloader?U-Boot启动流程全解析!

零基础详解&#xff1a;什么是Bootloader&#xff1f;U-Boot启动流程全解析&#xff01; 一、什么是Bootloader&#xff1f;&#x1f4cc; 举个例子&#xff1a; 二、U-Boot 是什么&#xff1f;三、U-Boot启动过程&#xff1a;分为两个阶段&#x1f539; 第一阶段&#xff08;汇…...

网络初识 - Java

网络发展史&#xff1a; 单机时代&#xff08;独立模式&#xff09; -> 局域网时代 -> 广域网时代 -> 移动互联网时代 网络互联&#xff1a;将多台计算机链接再一起&#xff0c;完成数据共享。 数据共享的本质是网络数据传输&#xff0c;即计算机之间通过网络来传输数…...

(51单片机)独立按键控制流水灯LED流向(独立按键教程)(LED使用教程)

源代码 如上图将7个文放在Keli5 中即可&#xff0c;然后烧录在单片机中就行了 烧录软件用的是STC-ISP&#xff0c;不知道怎么安装的可以去看江科大的视频&#xff1a; 【51单片机入门教程-2020版 程序全程纯手打 从零开始入门】https://www.bilibili.com/video/BV1Mb411e7re?…...

QML输入控件: TextArea的应用(带行号的编辑器)

目录 引言&#x1f4da; 相关阅读&#x1f528;BUG修复实现思路代码解析主窗口代码自定义TextAreaItem组件行号显示部分文本编辑区域滚动同步 关键功能解析1. 动态更新行号2. 属性映射3. 外观定制 运行效果总结工程下载 引言 在开发Qt/QML应用程序时&#xff0c;文本编辑功能是…...

kafka 的存储文件结构

Kafka 的存储文件结构是其高吞吐量和高效性能的关键部分。Kafka 的存储结构是围绕 日志&#xff08;Log&#xff09; 的设计展开的&#xff0c;而每个 Kafka 分区&#xff08;Partition&#xff09; 都会以日志文件的形式存储。Kafka 采用了顺序写入、分段存储和索引文件的机制…...

FAISS原理深度剖析与LLM检索分割难题创新解决方案

一、FAISS核心技术解构&#xff1a;突破传统检索的次元壁 1.1 高维空间的降维艺术 FAISS&#xff08;Facebook AI Similarity Search&#xff09;通过独创的Product Quantization&#xff08;乘积量化&#xff09;技术&#xff0c;将高维向量空间切割为多个正交子空间。每个子…...

Windows操作系统安全配置(一)

1.操作系统和数据库系统管理用户身份标识应具有不易被冒用的特点&#xff0c;口令应有复杂度要求并定期更换 配置方法&#xff1a;运行“gpedit.msc”计算机配置->Windows设置->安全设置>帐户策略->密码策略: 密码必须符合复杂性要求->启用 密码长度最小值->…...

JavaScript promise实例——通过XHR获取省份列表

文章目录 需求和步骤代码示例效果 需求和步骤 代码示例 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><!-- 确保IE浏览器使用最新的渲染引擎 --><meta http-equiv"X-UA-Compatible" conten…...

【力扣hot100题】(065)搜索旋转排序数组

难点在于情况真的很多需要逐一判断&#xff0c;画个走向图再写判断条件就行了。 还有处理边界条件也比较麻烦。 class Solution { public:int search(vector<int>& nums, int target) {int left0;int rightnums.size()-1;while(left<right){int mid(leftright)/…...

毕设论文的分类号与UDC查询的网站

毕业论文分类号 中图分类号查询链接 找到自己的细分类&#xff0c;一个一个点就好&#xff0c;然后就找到了 毕业论文UDC UDC查询...

pyqt5实现多个窗口互相调用

使用以下代码可以实现多窗口之间的相互调用&#xff1a; import sys from PyQt5.QtWidgets import QApplication, QMainWindow import win0, win1, win2, win3 # 分别包含 Ui_win0 和 Ui_win1class Win0Window(QMainWindow, win0.Ui_win0):def __init__(self, x, parentNone)…...

Python基于Django的企业it资产管理系统(附源码,文档说明)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…...

浅谈在HTTP中GET与POST的区别

从 HTTP 报文来看&#xff1a; GET请求方式将请求信息放在 URL 后面&#xff0c;请求信息和 URL 之间以 &#xff1f;隔开&#xff0c;请求信息的格式为键值对&#xff0c;这种请求方式将请求信息直接暴露在 URL 中&#xff0c;安全性比较低。另外从报文结构上来看&#xff0c…...

计算机视觉5——运动估计和光流估计

一、运动估计 &#xff08;一&#xff09;运动场&#xff08;Motion Field&#xff09; 定义与物理意义 运动场是三维场景中物体或相机运动在二维图像平面上的投影&#xff0c;表现为图像中每个像素点的运动速度矢量。其本质是场景点三维运动&#xff08;平移、旋转、缩放等&a…...