Java实现责任链模式

责任链模式是一种设计模式,用于处理请求的解耦。在责任链模式中,多个对象都有机会处理请求,从而避免了请求发送者和接收者之间的直接依赖关系。每个处理者都可以决定是否处理请求以及将请求传递给下一个处理者。

简介

责任链模式由一条链组成,每个处理者都有一个对下一个处理者的引用。当请求进入链中时,从链的开头开始依次询问每个处理者是否能够处理该请求。如果某个处理者能够处理请求,则处理请求并结束链,否则将请求传递给下一个处理者。这样,请求会在链上依次传递,直到有一个处理者能够处理请求或者到达链的末尾。

使用场景

责任链模式因为可以灵活地配置处理者的顺序和数量,而不需要修改客户端代码。所以责任链模式在项目实战中用处广泛。

  • JDK中的异常处理机制就使用了责任链模式。当某个方法抛出异常时,首先会在方法内部寻找try-catch块来捕获异常,如果没有找到,就会将异常向上一层抛出,直至找到合适的catch块处理。
  • Spring框架中的拦截器链机制也使用了责任链模式。拦截器链是通过将各个拦截器按照一定的顺序连接起来形成一个链条,在请求处理过程中按顺序调用每个拦截器的相应方法来完成一系列操作。

责任链模式还可以用于处理日志记录、用户权限验证等场景。

开发实例

现在我简单用Java代码实现责任链模式,帮助大家快速入门理解

定义责任链抽象类

首先需要定义责任链抽象类,其作用是定义一个抽象的责任链,将处理请求的对象串联起来,并且定义了处理请求的方法。

@Data
public abstract class AbstractHandler<T> {protected String name;protected AbstractHandler<T>  nextHandler;public AbstractHandler(String name){this.name = name;}public boolean hasNextHandler(){return nextHandler != null;}/*** 业务处理方法* @param t 传入参数* @return*/public abstract T process(T t);
}

具体业务处理类

业务处理类1

/*** 将传入的数字加2*/
public class AddTwoHandler extends AbstractHandler<Integer>{public AddTwoHandler(String name) {super(name);}@Overridepublic Integer process(Integer t) {t = t + 2;if(hasNextHandler()) {return nextHandler.process(t);}return t;}
}

业务处理类2

/*** 将传入的数字乘3*/
public class MultiThreeHandler extends AbstractHandler<Integer>{public MultiThreeHandler(String name) {super(name);}@Overridepublic Integer process(Integer t) {t = t * 3;if(hasNextHandler()) {return nextHandler.process(t);}return t;}
}

业务处理类3

/***  将传入的数字减1*/
public class DecreaseOneHandler extends AbstractHandler<Integer>{public DecreaseOneHandler(String name) {super(name);}@Overridepublic Integer process(Integer t) {t = t - 1;if(hasNextHandler()) {return nextHandler.process(t);}return t;}
}

代码测试

public class ChainTest {public static void main(String[] args) {AddTwoHandler two = new AddTwoHandler("加2");DecreaseOneHandler one = new DecreaseOneHandler("减1");MultiThreeHandler three = new MultiThreeHandler("乘3");two.nextHandler = one;one.nextHandler = three;Integer result = two.process(5);System.out.println(result);}
}

实现业务处理是,开始值是5,开始执行“加2”操作 ,之后执行“减1”操作,在之后执行“乘3”操作,最后输出结果18。

在不改变代码的情况下,如果修改链式的处理顺序,那结果也就完全不一样了,这就带来很多可扩展性,我们可以很灵活地改变处理者的顺序和添加新的处理者。

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

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

相关文章

服务容错-熔断策略之断路器hystrix-go

文章目录 概要一、服务熔断二、断路器模式三、hystrix-go3.1、使用3.2、源码 四、参考 概要 微服务先行者Martin Fowler与James Lewis在文章microservices中指出了微服务的九大特征&#xff0c;其中一个便是容错性设计(Design for failure)。正如文章中提到的&#xff0c;微服…

Python打印Python环境、PyTorch和CUDA版本、GPU数量名称等信息

代码&#xff1a; import torch import platformgpu_num torch.cuda.device_count() torch_version torch.__version__ python_version platform.python_version()print("Python Version: Python %s" % python_version) print("PyTorch Version: %s" %…

Spring之推断构造方法源码

文章目录 一、 简介1. 内容回顾2. Spring推断构造方法 二、 源码分析 一、 简介 1. 内容回顾 前面分析了Spring的Bean的生命周期的源码&#xff0c;然后分析了依赖注入源码&#xff0c;以及依赖注入的过程中循环依赖Spring的解决方案。在介绍Bean的生命周期中&#xff0c;我们…

三维模型的几何坐标纠正应用探讨

三维模型的几何坐标纠正应用探讨 倾斜摄影三维模型数据的几何坐标纠正应用分析 近年来&#xff0c;倾斜摄影技术在三维数据采集设备中得到广泛应用。倾斜摄影技术通过在飞行平台上搭载多台传感器&#xff0c;从不同角度采集影像&#xff0c;相比传统的摄影测量&#xff0c;倾斜…

每日算法打卡:数的三次方根 day 7

文章目录 原题链接题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 题目分析示例代码 原题链接 790. 数的三次方根 题目难度&#xff1a;简单 题目描述 给定一个浮点数 n&#xff0c;求它的三次方根。 输入格式 共一行&#xff0c;包含一个浮…

C++_虚析构

介绍 1.只有虚析构 (PS:没有虚构造) 2.加与不加 virtual关键词 的区别 2.1如果父类的析构函数 不是虚析构&#xff0c;则父类指针指向子类时&#xff0c;delete掉父类的指针 (PS:则效果为 只调用父类的析构的函数&#xff0c;不调用子类的析构函数) 2.2 如果父类的析构函数 是虚…

第17课 为rtsp流加入移动检测功能

在上节课&#xff0c;我们成功拿到了rtsp视频和音频流&#xff0c;在第13课&#xff0c;我们为普通的usb摄像头加上了移动检测功能&#xff0c;那能不能给rtsp摄像头也加上移动检测功能以实现一些好玩的应用呢&#xff1f;答案是肯定的&#xff0c;在usb摄像头检测中&#xff0…

vue结合Cesium加载gltf模型

Cesium支持什么格式&#xff1f; Cesium支持的格式包括&#xff1a;3D模型格式&#xff08;如COLLADA、gITF、OBJ&#xff09;、影像格式&#xff08;如JPEG、PNG、GeoTIFF&#xff09;、地形格式&#xff08;如STL、Heightmap&#xff09;、矢量数据格式&#xff08;如GeoJSON…

css计时器 animation实现计时器延时器

css计时器 animation实现计时器延时器 缺点当切页面导航会休眠不执行 最初需求是一个列表每个项目都有各自的失效时间 然后就想到 计时器延时器轮询等方案 这些方案每一个都要有自己的计时器 感觉不是很好 轮询也占资源 然后突发奇想 css能不能实现 开始想到的是transition测…

初识Linux shell

Linux初探 Linux系统可以划分为4个部分&#xff1a; Linux内核&#xff1a;Linux系统的核心&#xff0c;控制着系统的所有硬件和软件&#xff0c;在必要时分配硬件&#xff0c;并根据需要执行软件。 内核主要功能&#xff1a; 系统内存管理&#xff1a;内核通过硬件上称为交换…

labelImg的安装与使用

目录 1、查看本机是否安装labelImg 2、安装labelImg 3、创建自己的数据集 3.1 建立新文件夹 3.2 打开labelImg 注意&#xff1a;出现闪退的情况处理。 4、文件格式转换 4.1 修改文件夹路径 4.2 新建datasets文件夹 4.3 修改图片路径 4.4 执行 1、查看本机是否安装la…

【Origin绘图1】环形图

环形图绘制 Origin绘制环形图案例 MATLAB绘制环形饼状图案例 参考 环形图如下&#xff0c;可分析不同年份各组分变化情况&#xff1a; Origin绘制环形图 貌似对Origin版本有要求&#xff0c;下载的2019版并无环形图绘制工具。因此&#xff0c;重新下载了2022版本。 案例 第…

Python 利用PYQT5设计基于RSA算法盲签名的匿名化电子支付系统设计与实现

基于RSA算法的盲签名算法 David Chaum 于1982年提出盲签名的概念&#xff0c;并利用RSA算法设计了第一个盲签名方案. 该方案的安全性基于大整数分解问题 盲签名的步骤 1.密钥生成 签名者执行以下步骤生成密钥对: ①签名者选择两个大素数p,q&#xff0c; 计算npq&#xff0…

【OpenVINO 】在 MacOS 上编译 OpenVINO C++ 项目

前言 英特尔公司发行的模型部署工具OpenVINO™模型部署套件&#xff0c;可以实现在不同系统环境下运行&#xff0c;且发布的OpenVINO™ 2023最新版目前已经支持MacOS系统并同时支持在苹果M系列芯片上部署模型。在该项目中&#xff0c;我们将向大家展示如何在MacOS系统、M2芯片的…

编写一个简单的服务和客户端(C++)

背景 当节点使用服务进行通信时&#xff0c;发送数据请求的节点称为客户端节点&#xff0c;响应请求的节点称为服务节点。请求和响应的结构由.srv文件确定。 这里使用的例子是一个简单的整数加法系统&#xff1b;一个节点请求两个整数之和&#xff0c;另一个节点响应结果。 …

基于云平台技术的车辆远程诊断浅谈

基于云平台技术的车辆远程诊断浅谈 一、引言 随着汽车工业的不断发展&#xff0c;车辆故障诊断技术的需求日益增长。传统的车辆故障诊断方式已经无法满足现代汽车对高效、智能的追求。基于云平台技术的车辆远程诊断创新&#xff0c;为汽车故障诊断带来了新的解决方案。 二、…

【linux】docker基本概念和基础指令操作(镜像、容器)

docker docker镜像 images xxxx(名称):xxxx(版本号) 每一个image可以生成若干个容器&#xff08;container&#xff09;&#xff0c;所有用相同镜像生成的容器环境完全一样 每一个容器都是一个完全独立的云端服务器 镜像指令 docker pull ubuntu:20.04 #拉取一个镜像 doc…

鸿鹄电子招投标系统源码实现与立项流程:基于Spring Boot、Mybatis、Redis和Layui的企业电子招采平台

随着企业的快速发展&#xff0c;招采管理逐渐成为企业运营中的重要环节。为了满足公司对内部招采管理提升的要求&#xff0c;建立一个公平、公开、公正的采购环境至关重要。在这个背景下&#xff0c;我们开发了一款电子招标采购软件&#xff0c;以最大限度地控制采购成本&#…

HarmonyOS应用开发者基础(初级)认证题库

开发者能力认证 一、判断 首选项preferences是以Key-Value形式存储数据&#xff0c;其中Key是可以重复。&#xff08;错&#xff09;使用http模块发起网络请求时&#xff0c;必须要使用on(‘headersReceive’&#xff09;订阅请求头&#xff0c;请求才会成功。&#xff08;错…

15.脚本备份、恢复达梦DM数据库

1.备份脚本 #!/bin/bash # 通过docker命令查询达梦数据库容器id CONTAINER_IDdocker ps -a | grep "dm8_single" | awk {print $1} | head -n 1#备份目录 DUMP_DIR"/data/dm8/data/backup"DATE_FORMATdate %Y%m%d echo "备份my_db1数据库开始&#…