设计模式---责任链模式快速demo

  1. Handler(处理者): 定义一个处理请求的接口。通常包括一个处理请求的方法。它可以是抽象类或接口,也可以是具体类,具体类中包含了对请求的处理逻辑。处理者通常包含一个指向下一个处理者的引用。
  2. ConcreteHandler(具体处理者): 实现Handler接口的具体处理类。它负责处理请求,如果自己能够处理则处理,否则将请求传递给下一个处理者。
  3. Client(客户端): 创建一个请求并将其发送给处理者链中的第一个处理者,然后等待处理结果。

见代码

处理者:

package trade.pipe;import trade.model.order.reqVo.OrderPipeReqVo;public abstract class OrderBaseHandler {public String nodeName = "";public abstract void execute(OrderPipeReqVo request);public abstract void setNodeName();public String getNodeName() {return nodeName;}}

具体处理者:

CheckUserPermHandler // 校验用户权限
CheckOrderReqHandler // 请求参数基本校验
CheckOrderProductHandler // 检验产品信息
CheckOrderBuyerInfoHandler // 校验买家所有信息
CheckOrderSellerInfoHandler // 校验卖家基本信息
AssembleOrderBaseHandler // 封装订单基本信息
AssembleOrderTradeHandler // 封装订单交易基本信息
AssembleOrderProductHandler // 封装订单商品基本信息
AssembleOrderPriceHandler // 封装订单价格信息
AssembleOrderPayHandler // 封装付款单
AssembleOrderPayDetailHandler // 封装付款单详情
AssembleOrderInvoiceHandler // 封装订单发票基本信息
OccupiedInventoryHandler // 锁定库存
SaveOrderBaseHandler // 保存普通订单所有数据
SaveOrderSearchHandler // 保存寻车订单特别数据
SaveOrderLogHandler // 保存订单日志
OrderJobsHandler // 订单完成创建定时任务
OrderMQsHandler // MQ

此处只列举几个

@Component
@Slf4j
public class CheckUserPermHandler extends OrderBaseHandler {@Overridepublic void execute(OrderPipeReqVo request) {log.info("校验用户权限==>>start");log.info("校验用户权限==>>end");}@Overridepublic void setNodeName() {this.nodeName = "校验用户权限";}
}// ...
@Component
@Slf4j
public class CheckOrderReqHandler extends OrderBaseHandler {@Overridepublic void execute(OrderPipeReqVo request) {log.info("请求参数基本校验==>>start");log.info("请求参数基本校验==>>end");}@Overridepublic void setNodeName() {this.nodeName = "请求参数基本校验";}
}// ...
@Component
@Slf4j
public class CheckOrderProductHandler extends OrderBaseHandler {@Overridepublic void execute(OrderPipeReqVo request) {log.info("检验产品信息==>>start");log.info("检验产品信息==>>end");}@Overridepublic void setNodeName() {this.nodeName = "检验产品信息";}
}

责任链节点请求类

public class OrderPipeReqVo implements Serializable {private ResultVo<Object> resultVo;private Object a;private Object b;private Object c;private Object d;// 其他业务处理类
}

封装客户端

实际应用中,我们需要对责任链进行组装,以便客户端可以方便快速的调用 ,且无需重复组装.

import cn.hutool.extra.spring.SpringUtil;@Component
@Slf4j
public class OrderPipeline {private static Map<String, List<OrderBaseHandler>> handlersMap = new HashMap<>();public static List<OrderBaseHandler> getHandlersMap(String tradeType) {return handlersMap.get(tradeType);}// 封装A订单链点静态方法private static List<String> getOrderHandlers() {List<String> list = Lists.newArrayList();list.add("checkUserPermHandler"); // 校验用户权限list.add("checkOrderReqHandler"); // 请求参数基本校验list.add("checkOrderProductHandler"); // 检验产品信息list.add("checkOrderSellerInfoHandler"); // 校验卖家基本信息list.add("checkOrderBuyerInfoHandler"); // 校验买家所有信息list.add("assembleOrderBaseHandler"); // 封装订单基本信息list.add("assembleOrderTradeHandler"); // 封装订单交易基本信息list.add("assembleOrderProductHandler"); // 封装订单商品基本信息list.add("assembleOrderPriceHandler"); // 封装订单价格信息list.add("assembleOrderPayHandler"); // 封装付款单list.add("assembleOrderPayDetailHandler"); // 封装付款单详情list.add("assembleOrderInvoiceHandler"); // 封装订单发票基本信息list.add("checkOrderAssemble2ReqHandler"); // 业务封装 校验list.add("occupiedInventoryHandler"); // 锁定库存list.add("saveOrderBaseHandler"); // 保存普通订单所有数据list.add("saveOrderSearchHandler"); // 保存订单特别数据list.add("saveOrderLogHandler"); // 保存订单日志list.add("orderJobsHandler"); // 订单完成创建定时任务list.add("orderMQsHandler"); // MQreturn list;}// 封装B订单链点静态方法private static List<String> getSearchOrderHandlers() {List<String> list = Lists.newArrayList();list.add("checkUserPermHandler"); // 校验用户权限list.add("checkOrderReqHandler"); // 请求参数基本校验list.add("checkOrderProductHandler"); // 检验产品信息list.add("checkOrderSellerInfoHandler"); // 校验卖家基本信息list.add("checkOrderBuyerInfoHandler"); // 校验买家所有信息list.add("assembleOrderBaseHandler"); // 封装订单基本信息list.add("assembleOrderTradeHandler"); // 封装订单交易基本信息list.add("assembleOrderProductHandler"); // 封装订单商品基本信息list.add("assembleOrderPriceHandler"); // 封装订单价格信息list.add("assembleOrderPayHandler"); // 封装付款单list.add("assembleOrderPayDetailHandler"); // 封装付款单详情list.add("assembleOrderInvoiceHandler"); // 封装订单发票基本信息list.add("assembleOrderSearchHandler"); // 封装订单信息list.add("checkOrderAssemble2ReqHandler"); // 业务封装 list.add("occupiedInventoryHandler"); // 锁定库存list.add("saveOrderBaseHandler"); // 保存普通订单所有数据list.add("saveOrderBBBHandler"); // 保存订单特别数据list.add("saveOrderLogHandler"); // 保存订单日志list.add("orderJobsHandler"); // 订单完成定时任务list.add("orderMQsHandler"); // MQ 无服务费 无定金 发起签约return list;}// ...// 组装订单责任链map@PostConstructpublic void init() {log.info("开始初始化订单责任链");List<OrderBaseHandler> orderBaseHandlers = getOrderHandlers().stream().map(bean -> (OrderBaseHandler) SpringUtil.getBean(bean)).collect(Collectors.toList());orderBaseHandlers.stream().forEach(b-> System.out.print(b.getClass().getName()+"-"));log.info("A订单责任链组装完成");handlersMap.put("ORDER_A", orderBaseHandlers);List<OrderBaseHandler> searchOrderHandlers = getSearchOrderHandlers().stream().map(bean -> (OrderBaseHandler) SpringUtil.getBean(bean)).collect(Collectors.toList());searchOrderHandlers.stream().forEach(b-> System.out.print(b.getClass().getName()+"-"));log.info("B订单责任链组装完成");handlersMap.put("ORDER_B", searchOrderHandlers);log.info("订单责任链初始化完成");}
}

调用实例

 @Overridepublic Result<Object> test() {List<OrderBaseHandler> order_new = OrderPipeline.getHandlersMap("ORDER_A");order_new.forEach(item->{System.out.println(item.getClass().getName());item.execute(null);});System.out.println("====================================================================");List<OrderBaseHandler> order_search = OrderPipeline.getHandlersMap("ORDER_B");order_search.forEach(item->{System.out.println(item.getClass().getName());item.execute(null);});return Result.success();}

项目启动控制台打印:

执行test()方法:

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

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

相关文章

JAVA封装和包

一.包的概念&#xff1a; 下面是包的目录位置&#xff1a; 在src底下的demo&#xff0c;com&#xff0c;baidu相当于一个文件夹&#xff0c;可以存放类&#xff0c;同一个包类名不能相同&#xff0c;不同的包的类名可以相同。&#xff08;通俗点来说&#xff1a;一个包相当于一…

手撕数据结构 —— 堆(C语言讲解)

目录 1.堆的认识 什么是堆 堆的性质 2.堆的存储 3.堆的实现 Heap.h中接口总览 具体实现 堆结构的定义 初始化堆 销毁堆 堆的插入 堆的向上调整算法 堆的插入的实现 堆的删除 堆的向下调整算法 堆的删除的实现 使用数组初始化堆 获取堆顶元素 获取堆中的数据…

南科大分享|大数据技术如何赋能大模型训练及开发

嘉宾介绍 张松昕&#xff0c;南方科技大学统计与数据科学系研究学者&#xff0c;UCloud 顾问资深算法专家&#xff0c;曾任粤港澳大湾区数字经济研究院访问学者&#xff0c;主导大模型高效分布式训练框架的开发&#xff0c;设计了 SUS-Chat-34B 的微调流程&#xff0c;登顶 Ope…

2010年国赛高教杯数学建模A题储油罐的变位识别与罐容表标定解题全过程文档及程序

2010年国赛高教杯数学建模 A题 储油罐的变位识别与罐容表标定 通常加油站都有若干个储存燃油的地下储油罐&#xff0c;并且一般都有与之配套的“油位计量管理系统”&#xff0c;采用流量计和油位计来测量进/出油量与罐内油位高度等数据&#xff0c;通过预先标定的罐容表&#…

手把手教你在一台服务器上部署多个nginx

1.安装依赖和插件 yum -y install gcc gcc-c pcre pcre-devel openssl openssl-devel zlib zlib-devel wget net-tools 如果下载安装失败&#xff0c;可以考虑更换一下网络YUM源后再重新执行上一步。CentOS更换网络yum源——阿里源-CSDN博客 2.下载nginx的压缩包 cd /usr/l…

JIT详解

文章目录 JIT为什么说 Java 语言“编译与解释并存”&#xff1f; JIT原理JVM 架构简览JIT 编译流程JIT 编译器的实现优化策略方法内联逃逸分析 JIT 在Java中&#xff0c;JIT&#xff08;Just-In-Time&#xff09;编译器是Java虚拟机&#xff08;JVM&#xff09;的一个重要组成…

数据结构邻接表表示图的深度优先搜索遍历 有向图+无向图(C语言代码+终端输入内容)

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #define MAXVEX 20 //下面三个结构体就是邻接表的结构体&#xff0c;完全一样的方式 typedef struct EdgeNode {int adjvex;struct EdgeNode* next; }EdgeNode; typedef struct VertexNo…

sql数据库命令行操作(数据库的增删改查)

查询数据库 查询电脑里面所有数据库 SHOW DATABASES;查询当前所处的数据库 SELECT DATABASE();应用场景&#xff1a;当我使用了USE命令后不知道自己所在哪个数据库时&#xff0c;可以使用这个命令查询自己所在数据库 创建数据库 创建 CREATE DATABASE [IF NOT EXISTS] 数据…

UE4 材质学习笔记10(程序化噪波/覆雪树干着色器/岩层着色器)

一.程序化噪波 柏林噪波是一种能生成很好的随机图案的算法&#xff0c;它是一个无限的、不重复的图案&#xff0c;可以采用这种基础图案并以多种方式对其进行修改&#xff0c; 将它缩放并进行多次组合&#xff0c;就可以创建一个分形图案。这些组合的缩放等级称为一个Octave 这…

守护“视界”,手持式视力筛查仪解决方案

根据国家卫健委数据显示&#xff0c;2022年我国儿童青少年总体近视率为53.6%&#xff0c;整体近视率呈低龄高发态势&#xff0c;其中小学生为35.6%&#xff0c;初中生为71.1%&#xff0c;高中生甚至近视率高达80.5%。随着电视、电脑、平板、手机等电子设备深度侵入人们的生活&a…

力扣题31~40

题31&#xff08;中等&#xff09;&#xff1a; 分析&#xff1a; 其实这题题目比较难懂&#xff0c;题目还是挺简单的 我们可以从后面末尾开始&#xff0c;如果前一个大于后面的&#xff0c;说明后面不用动&#xff0c;如果小于&#xff0c;那就找仅仅大于它的数字放前面&…

iOS 18升级:避免常见陷阱,顺利完成升级

随着iOS 18的发布&#xff0c;许多用户都希望尽快体验到新系统带来的新功能和改进。然而&#xff0c;升级过程可能会因为准备工作不足或对步骤的不熟悉而变得复杂。本文旨在为用户提供一个清晰的升级指南&#xff0c;确保升级过程既平滑又安全。 升级前的准备工作 在开始升级之…

Linux操作系统小项目——实现《进程池》

文章目录 前言&#xff1a;代码实现&#xff1a;原理讲解&#xff1a;细节处理&#xff1a; 前言&#xff1a; 在前面的学习中&#xff0c;我们简单的了解了下进程之间的通信方式&#xff0c;目前我们只能知道父子进程的通信是通过匿名管道的方式进行通信的&#xff0c;这是因…

JAVA自动化测试TestNG框架

1.TestNG简介 JAVA自动化测试最重要的基石。官网&#xff1a;https://testng.org 使用注解来管理我们的测试用例。 发现测试用例 执行测试用例 判断测试用例 生成测试报告 2.创建Maven工程 2.1创建一个maven工程 2.2设置maven信息 2.3设置JDK信息 2.4引入testng依赖 <dep…

软考高级系统规划与管理师,都是精华知识点!

知识点&#xff1a;信息的定义和属性 1、 信息的基本概念 l 信息是客观事物状态和运动特征的一种普遍形式&#xff0c;客观世界中大量地存在、产生和传递着以这些方式表示出来的各种各样的信息。 l 维纳&#xff08;控制论创始人&#xff09;&#xff1a;信息就是信息&#…

指针——数据结构解惑

文章目录 一.取指针和解指针二.为什么用指针&#xff1f; 指针存的是地址 一.取指针和解指针 int main() {int a0;int * p ;//声明int类型的**指针**char * m ;//声明char类型的**指针**&a;//a是个变量&#xff0c;&a&#xff0c;把地址取出来p&a;//p指针存的a的地…

双十一性价比高的宠物空气净化器推荐,希喂、美的、352测评分享

不知不觉这一年就要过去了&#xff0c;别问我为什么这么感伤&#xff0c;因为双十一要来了&#xff0c;我要开始”剁手“了&#xff0c;尤其是必须得买宠物空气净化器。 因为我家里养了两只猫&#xff0c;超级爱掉毛&#xff0c;每天为了清理这些猫毛我都要烦死了&#xff0c;…

LangChain4j使用阿里云百炼 进行AI调用

LangChain4j 介绍 LangChain4j 是一个专为Java开发者设计的开源库&#xff0c;旨在简化将大型语言模型&#xff08;LLM&#xff09;集成到Java应用程序中的过程。它于2023年初开发&#xff0c;灵感来源于Python和JavaScript的LLM库&#xff0c;特别是为了填补Java领域在这一方面…

支持阅后即焚的笔记Enclosed

什么是 Enclosed &#xff1f; Enclosed 是一个简约的网络应用程序&#xff0c;旨在发送私人和安全的笔记。所有笔记均经过端到端加密&#xff0c;确保服务器和存储对内容一无所知。用户可以设置密码、定义有效期 (TTL)&#xff0c;并选择在阅读后让笔记自毁。 软件特点&#x…

软考高项一年只考一次,2025 年会更难考吗?

根据近几年的考试情况来看&#xff0c;可以推测25年的高项考试可能会更加困难。值得关注的是2024年的考试情况&#xff0c;当年的高项考试是第二次机考&#xff0c;考试形式已经相对稳定。上午考试的科目知识点分布保持稳定&#xff0c;包括1道综合计算题和2道分析题的案例分析…