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

devtools/2024/10/18 2:38:41/
  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.ppmy.cn/devtools/126616.html

相关文章

网络安全公司及其主要产品介绍

以下是一些全球领先的网络安全公司及其主要产品介绍&#xff1a; 一、思科&#xff08;Cisco&#xff09; 思科是全球最大的网络设备供应商之一&#xff0c;其网络安全产品以企业级解决方案为主&#xff0c;覆盖多种安全需求。 Cisco ASA&#xff08;Adaptive Security Appli…

【数据结构】宜宾大学-计院-实验三

线性表的应用——实现两多项式的相加 课前准备&#xff1a;实验学时&#xff1a;2实验目的&#xff1a;实验内容&#xff1a;实验结果&#xff1a;实验报告:&#xff08;及时撰写实验报告&#xff09;实验测试结果&#xff1a;代码实现&#xff1a;&#xff08;C/C&#xff09;…

C++类与对象-继承和多态(超全整理)

前言 前面讲类与对象上中下时&#xff0c;所讲的都是在单个类中相关的语法&#xff08;初始化列表、this指针、静态成员、常函数和常对象......&#xff09;或者使两个不同的类产生联系的语法&#xff08;友元&#xff09;。而本文虽然也是类与对象的内容&#xff0c;但和之前的…

PROFINET开发EtherNet/IP开发Vline板卡在称重设备行业的应用

本次分享的&#xff0c;是我们VlinePROFINET开发EtherNet/IP开发嵌入式板卡在称重行业的典型应用。 应用背景 在现代科技高度发达的时代&#xff0c;无论是科学研究、医疗诊断、制药生产还是工业制造&#xff0c;准确的测量和称重都是保证质量和效率的关键。 随着新项目实施…

深度学习 size 属性

使用示例 import mxnet as mx# 创建一个 2D 数组 arr mx.nd.array([[1, 2, 3], [4, 5, 6]]) print(arr.size) # 输出: 6&#xff0c;因为数组中有 6 个元素# 创建一个 3D 数组 arr3d mx.nd.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) print(arr3d.size) # 输出: 8&…

React1-基础概念

1.基础概念 组件&#xff08;Components&#xff09;&#xff1a;React 的基本构建块&#xff0c;可以是函数组件或类组件。 JSX&#xff08;JavaScript XML&#xff09;&#xff1a;允许在 JavaScript 中书写类似 HTML 的代码。 状态&#xff08;State&#xff09;&#xf…

阿里云国际站DDoS高防增值服务怎么样?

利用国外服务器建站的话&#xff0c;选择就具有多样性了&#xff0c;相较于我们常见的阿里云和腾讯云&#xff0c;国外的大厂商还有谷歌云&#xff0c;微软云&#xff0c;亚马逊云等&#xff0c;但是较之这些&#xff0c;同等产品进行比较的话&#xff0c;阿里云可以说当之无愧…

性能优化-SQL查询优化技巧全解

SQL查询优化技巧全解 在数据库操作中&#xff0c;SQL查询的性能直接影响到应用程序的响应速度。本文将深入探讨SQL查询优化的关键技术&#xff0c;并结合实例展示如何使用itBuilder这款强大的数据库设计、建模软件&#xff0c;来辅助提升开发效率。 1. SQL查询基础与执行计划…