使用Apache Commons Chain实现责任链模式实例

介绍

责任链模式是一种行为型设计模式,用于将多个处理器对象组织成一条链,并沿着链传递某个请求,直到有一个处理器对象能够处理该请求为止。它的核心是将请求和处理器对象解耦,让请求在不知道哪个处理器对象能够处理它的情况下,能够被正确地处理。
责任链模式的主要优点包括:
1.解耦请求和处理器对象:责任链模式将请求和处理器对象解耦,让请求在不知道哪个处理器对象能够处理它的情况下,能够被正确地处理。这样可以增加系统的灵活性和可扩展性。
2.简化对象之间的耦合关系:责任链模式将多个处理器对象组织成一条链,每个处理器对象只需要关注自己的处理逻辑,不需要关注其他处理器对象的处理逻辑,从而简化了对象之间的耦合关系。
3.可以动态地增加或修改处理器对象:由于责任链模式将多个处理器对象组织成一条链,因此可以动态地增加或修改处理器对象,从而改变处理器对象的顺序或增加新的处理器对象,以满足不同的业务需求。
4.可以避免请求被漏处理或重复处理:由于责任链模式会沿着链传递请求,直到有一个处理器对象能够处理该请求为止,因此可以避免请求被漏处理或重复处理的问题。
5.可以灵活地处理请求:由于责任链模式可以根据不同的业务需求组织不同的处理器对象,因此可以灵活地处理各种不同类型的请求。
总之,责任链模式可以将多个处理器对象组织成一条链,提高系统的灵活性和可扩展性,简化对象之间的耦合关系,避免请求被漏处理或重复处理,可以灵活地处理各种不同类型的请求。

Apache Commons Chain 是一组轻量级的组件,可以用于实现责任链模式。这里给出一个基于 Apache Commons Chain 的责任链模式实现的示例:

代码

首先,需要定义一个 Command 接口,表示处理器对象(责任链中的一个节点):

public interface Command {boolean execute(Context context) throws Exception;
}

其中,execute 方法用于执行某个处理逻辑,返回一个布尔值表示该处理器对象是否能够处理请求。
然后,需要定义一个 AbstractCommand 抽象类,实现了 Command 接口,并提供了一些通用的方法:

public abstract class AbstractCommand implements Command {protected abstract boolean doExecute(Context context) throws Exception;@Overridepublic boolean execute(Context context) throws Exception {boolean result = doExecute(context);if (!result) {return false;}return executeNext(context);}protected boolean executeNext(Context context) throws Exception {Command nextCommand = getNextCommand(context);if (nextCommand != null) {return nextCommand.execute(context);}return true;}protected Command getNextCommand(Context context) {return null;}
}

AbstractCommand 抽象类中提供了 doExecute 抽象方法,表示具体的处理逻辑。在 execute 方法中,首先调用 doExecute 方法执行处理逻辑,如果处理成功,则调用 executeNext 方法继续执行下一个处理器对象。executeNext 方法会调用 getNextCommand 方法获取下一个处理器对象,如果存在,则调用其 execute 方法处理请求。
最后,可以定义一些具体的处理器对象(节点),继承 AbstractCommand 抽象类,并实现其方法:

public class ValidateUserCommand extends AbstractCommand {@Overrideprotected boolean doExecute(Context context) throws Exception {// 执行验证用户的逻辑return true;}@Overrideprotected Command getNextCommand(Context context) {// 返回下一个处理器对象return new CheckInventoryCommand();}
}public class CheckInventoryCommand extends AbstractCommand {@Overrideprotected boolean doExecute(Context context) throws Exception {// 执行检查库存的逻辑return true;}@Overrideprotected Command getNextCommand(Context context) {// 返回下一个处理器对象return new PlaceOrderCommand();}
}public class PlaceOrderCommand extends AbstractCommand {@Overrideprotected boolean doExecute(Context context) throws Exception {// 执行下单的逻辑return true;}@Overrideprotected Command getNextCommand(Context context) {// 返回下一个处理器对象return null;}
}

在这个示例中,定义了三个具体的处理器对象,分别用于验证用户、检查库存和下单。这三个处理器对象被组织成一条链,在 execute 方法中沿着链传递请求,直到有一个处理器对象能够处理该请求为止。
最后,可以使用 Chain 工具类创建责任链对象,并将请求传递给该责任链对象:

Chain chain = new ChainBase();
chain.addCommand(new ValidateUserCommand());
chain.addCommand(new CheckInventoryCommand());
chain.addCommand(new PlaceOrderCommand());Context context = new ContextBase();
// 设置请求参数
context.put("order", new Order());
// 执行责任链
boolean result = chain.execute(context);

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

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

相关文章

Mysql数据库

目录 1.数据库 2.数据库分类与常见的数据库 3.SQL 3.1.DDL 数据库操作 表操作 3.2.DML 3.3.DQL 3.4.DCL 管理用户 权限控制 4.Mysql常用的数据类型 1.数据库 数据库:是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共…

Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

目录 一、单个控制器异常处理 1.1 控制器方法 1.2 编写出错页面 1.3 测试结果 二、全局异常处理 2.1 一个有异常的控制器类 2.2 全局异常处理器类 2.3 测试结果 三、自定义异常处理器 3.1 自定义异常处理器 3.2 测试结果 往期专栏&文章相关导读 1. Maven系列…

只需3步,使用Stable Diffusion无限生产AI数字人视频

效果演示 先看效果,感兴趣的可以继续读下去。 没有找到可以上传视频的地方,大家打开这个网盘链接观看:https://www.aliyundrive.com/s/CRBm5NL3xAE 基本方法 搞一张照片,搞一段语音,合成照片和语音,同…

SpringBoot+jasypt-spring-boot-starter实现配置文件明文加密

1.使用环境 springboot:2.1.4.RELEASE JDK:8 jasypt-spring-boot-starter:3.0.2 2.引入依赖 !-- 配置文件加密 --> <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><ver…

uni-app:请求后端数据uni.request

完整代码&#xff1a; onLoad() {uni.request({url: getApp().globalData.position Produce/select_employee,data: {username: getApp().globalData.username,},method: POST,dataType: json,success: res > {this.employee_name res.data.info.employee_name;// consol…

sketch如何在线打开?有没有什么软件可以辅助

Sketch 在线打开的方法有哪些&#xff1f;这个问题和我之前回答过的「Sketch 可以在线编辑吗&#xff1f;」是一样的答案&#xff0c;没有。很遗憾&#xff0c;Sketch 没有在线打开的方法&#xff0c;Sketch 也做不到可以在线编辑。那么&#xff0c;那些广告里出现的设计软件工…

数学建模学习(4):TOPSIS 综合评价模型及编程实战

一、数据总览 需求&#xff1a;我们需要对各个银行进行评价&#xff0c;A-G为银行的各个指标&#xff0c;下面是银行的数据&#xff1a; 二、代码逐行实现 清空代码和变量的指令 clear;clc; 层次分析法 每一行代表一个对象的指标评分 p [8,7,6,8;7,8,8,7];%每一行代表一个…

Docker 基本管理

目录 一、Docker 概述 二、为什么容器越来越受欢迎&#xff1f; 三、Docker 与 虚拟机 的区别 四、 Linux Namespace的6大类型 五、Docker 核心概念 1.镜像 2.容器 3.仓库 六、安装 Docker 1.安装依赖包 2.设置阿里云镜像源&#xff0c;安装Docker 3.查看 docker 版…

PostgreSQL 的事务管理和并发控制机制解析

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

视频参数简介

max-mbps:表示每秒钟能处理的最大宏块数量。 max-fs: 表示接收端能够解码的一帧图像的最大尺寸&#xff0c;这个尺寸用这帧图像包含的宏块数来量化&#xff0c;即max-fs的数值。常见的分辨率与max-fs关系如下&#xff1a; 640x360P : 920 1280x720P: 3600 1920x1080P: 8160 max…

BEVPoolv2 A Cutting-edge Implementation of BEVDet Toward Deployment 论文学习

Github Repo: https://github.com/HuangJunJie2017/BEVDet/tree/dev2.0 Arxiv Paper: https://arxiv.org/abs/2211.17111 1. 解决了什么问题&#xff1f; 多相机 3D 目标检测是自动驾驶领域的基本任务&#xff0c;受到学术界和工业界的大量关注。Lift-Splat-Shoot view trans…

React知识点梳理

React是一个用于构建用户界面的JavaScript库。它采用组件化的开发模式&#xff0c;将用户界面拆分为独立的、可重用的组件&#xff0c;通过组件的组合和交互来构建复杂的用户界面。 下面是React的一些核心概念和知识点的梳理&#xff0c;并附带详细示例&#xff1a; 组件(Comp…

MFC第十九天 记事本项目功能完善和开发、CTabCtrl类与分页模式开发

文章目录 记事本项目功能完善和开发查找界面的记忆功能 、使用F3快捷键自动向下查找功能 的开发单次替换的算法研究 CFileDialog 构造函数详解 应用另存为时选择编码 &#xff08;三种方案&#xff09;vista 样式文件对话框 bVistaStyle 为TRUE时 1pch.hCApp NotePad.cpp 对编码…

视频对比工具(基于python+ffmpeg+airtest实现视频抽帧比较工具)

VideoDiff&#xff1a;基于ffmpeg&#xff0c;实现视频抽帧比较工具 使用场景&#xff1a;在视频渲染模块发生迭代&#xff0c;快速回归测试其产出的视频是否存在问题&#xff0c;从而节省人工回归成本 源码地址&#xff1a;https://github.com/jiangliuer32/VideoDiff 原理图…

软件架构演进过程与微服务设计中的领域驱动设计(DDD)

软件架构的演进是一个不断改进和解决问题的过程。从传统架构到面向服务架构(SOA)&#xff0c;再到微服务架构&#xff0c;每个阶段都带来了新的技术和解决方案。而在微服务架构中&#xff0c;领域驱动设计(DDD)起着至关重要的作用&#xff0c;它能够提高系统的可扩展性、可维护…

快速响应和恢复:使用自动化测试进行系统性能测试

快速响应和恢复&#xff1a;使用自动化测试进行系统性能测试 在当今数字化时代&#xff0c;用户对于应用程序性能的期望越来越高。快速响应和恢复是确保用户满意度和业务成功的关键因素之一。为了保证应用程序在不同负载和条件下的可靠性和稳定性&#xff0c;进行系统性能测试…

centos7中MySQL备份还原策略

目录 一、直接拷贝数据库文件 1.1在shangke主机上停止服务并且打包压缩数据库文件 1.2 在shangke主机上把数据库文件传输到localhost主机上(ip为192.168.33.157) 1.3在localhost主机上停止服务&#xff0c;解压数据库文件 1.4 在localhost主机上开启服务 1.5 测试 二、m…

在vue项目中使用postcss-px2rem插件把px转变为rem,并配合给html根元素设置fontsize,来实现页面的自适应效果

在vue项目中使用postcss-px2rem插件把px转变为rem&#xff0c;并配合给html根元素设置fontsize&#xff0c;来实现页面的自适应效果 安装postcss-px2rem插件&#xff0c;目的&#xff1a;把px转变为remvue.config.js中配置remUnit通过js改变html的fontsize值postcss-px2rem插件…

JVM-Java虚拟机

JVM——Java虚拟机&#xff0c;是Java实现平台无关性的基石。 基本概念&#xff1a;JVM 是可运行 Java 代码的假想计算机 &#xff0c;包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收&#xff0c;堆 和 一个存储方法域。JVM 是运行在操作系统之上的&#xff0c;它与…

【Docker】基本概念和底层技术

Docker 1 什么是 Docker Docker 是一种容器技术。只要开发者将其应用和依赖包进行打包&#xff0c;放入到一个轻量级的、可移植的容器中&#xff0c;就能发布到任何流行的 linux 机器上。 Docker 的要素&#xff1a; image 镜像&#xff1a;静态的container 容器&#xff1a…