责任链模式实现规则校验

ops/2024/9/24 16:19:46/

1、项目中责任链模式实战
我们使用责任链模式实现对订单中参数的校验,首先校验订单id是否为空,然后校验下单人是否为空,最后检验收获地址是否为空。业务的流程图如下所示:
在这里插入图片描述
针对上述的业务,我们使用责任链的模式来实现这个功能:
(1)定义一个责任链的接口

java">public interface OrderCheckHandler {/*** 当前的订单检测实现逻辑* @param orderCheckParam*/void check(OrderCheckParam orderCheckParam);/*** 设置下一个检测的实现逻辑* @param nextOrderCheckHandler* @return*/OrderCheckHandler setNext(OrderCheckHandler nextOrderCheckHandler);
}

(2)责任链中的公共逻辑的抽取

java">public abstract class BaseCheckOrderHandler implements OrderCheckHandler {private OrderCheckHandler nextOrderCheckHandler;@Overridepublic void check(OrderCheckParam orderCheckParam) {this.currentCheck(orderCheckParam);if(Objects.nonNull(nextOrderCheckHandler)){nextOrderCheckHandler.check(orderCheckParam);}}/*** 具体的实现逻辑**/protected abstract void currentCheck(OrderCheckParam orderCheckParam);@Overridepublic OrderCheckHandler setNext(OrderCheckHandler nextOrderCheckHandler) {this.nextOrderCheckHandler = nextOrderCheckHandler;return this.nextOrderCheckHandler;}
}

(3)具体的检验逻辑(继承公共逻辑)

java">-- 订单id校验
public class OrderIdCheckHandler extends BaseCheckOrderHandler {@Overrideprotected void currentCheck(OrderCheckParam orderCheckParam) {if(orderCheckParam.getOrderId() == null){throw new RuntimeException("订单id为空");}}
}
-- 用户校验
public class BuyerCheckHandler extends BaseCheckOrderHandler {@Overrideprotected void currentCheck(OrderCheckParam orderCheckParam) {if(orderCheckParam.getBuyer() == null){throw new RuntimeException("用户不可以为空");}}
}
-- 地址校验
public class AddressCheckHandler extends BaseCheckOrderHandler {@Overrideprotected void currentCheck(OrderCheckParam orderCheckParam) {if(orderCheckParam.getAddress() == null){throw new RuntimeException("用户地址不可以为空");}}
}

(4)使用spring将业务逻辑串联起来

java">@Configuration
public class OrderCheckConfig {@Beanpublic BuyerCheckHandler buyerCheckHandler(){return new BuyerCheckHandler();}@Beanpublic OrderIdCheckHandler checkOrderIdHandler(){return new OrderIdCheckHandler();}@Beanpublic AddressCheckHandler addressCheckHandler(){return new AddressCheckHandler();}//设置责任链得执行链路顺序@Beanpublic OrderCheckHandler orderCheckHandler(){OrderIdCheckHandler orderIdCheckHandler = this.checkOrderIdHandler();orderIdCheckHandler.setNext(this.buyerCheckHandler()).setNext(this.addressCheckHandler());return orderIdCheckHandler;}
}

(5)service调用责任链的

java">@Service
public class OrderService {@Resourceprivate OrderCheckHandler orderCheckHandler;public String checkOrderParam(OrderCheckParam param){orderCheckHandler.check(param);return "success";}
}

(6)controller逻辑

java">@RestController
@RequestMapping("/test")
public class ZeRenLianTestController {@Resourceprivate OrderService orderService;@GetMapping("/checkOrder")public String checkOrder(){OrderCheckParam orderCheckParam = new OrderCheckParam();orderCheckParam.setAddress("123");orderCheckParam.setOrderId("1235689");return orderService.checkOrderParam(orderCheckParam);}
}

如果现在需要增加一种校验(如增加订单物流的校验),此时我们只需要增加一个业务的实现类,然后在spring的配置将这个业务实现类加入到责任链逻辑上就可以了。

总结:
(1)需要保证责任链的结构清晰、避免创建过长的链,进而提升执行的性能。
(2)每个业务应该具有单一职责,每个对象专注于处理自己的逻辑。
(3)责任链模式使用的典型场景是多个对象处理同一个请求,如OA审批、参数的校验、日志记录器链等等。


http://www.ppmy.cn/ops/115354.html

相关文章

信息技术服务认证的获证流程

认证的流程 准备阶段 企业了解认证要求,确定认证范围和目标。 组建认证工作小组,进行内部培训和宣传。 对企业的信息技术服务管理体系进行自我评估,找出差距和改进方向。 实施阶段 按照认证标准的要求,完善信息技术服务管理体系。…

Go 1.19.4 序列化和反序列化-Day 16

1. 序列化和反序列化 1.1 序列化 1.1.1 什么是序列化 序列化它是一种将程序中的数据结构(map、slice、array等)或对象状态转换成一系列字节序列的过程,这些字节可以被存储或通过网络发送。 在GO中,序列化通常涉及到将结构体或其…

数模方法论-无约束问题求解

一、基本概念 无约束问题在数学建模中是指优化过程中没有任何限制条件的情况。这种问题旨在寻找一个决策变量集合,使得某个目标函数(如成本、效益或其他需要优化的量)达到最大或最小值。具体来说,无约束问题通常可以表示为&#x…

CSS中的多种关系选择器

后代选择器 选择所有被E元素包含的F元素&#xff0c;中间用空格隔开。 例&#xff1b; <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title…

南京服务器测评【浪浪云】

前言 优质的服务器对于企业来说无疑是一把快速实现科技化成长的利剑。而南京&#xff0c;作为中国科技龙头之一的城市&#xff0c;也对服务器的需求愈发旺盛。而作为国内领先的云服务商&#xff0c;浪浪云致力于用科技培植企业的成长&#xff0c;其在南京的服务器便是企业数字化…

KITTI数据集雷达采样点时间戳属性的思考(Failed to find match for field ‘time‘)

最近在SLAM调研期间&#xff0c;看到了FAST-LIO2以及Point-lio这两个比较新的SLAM建图算法&#xff0c;想着上手编译并且运行一下&#xff0c;选择了自己了解到的比较出名的数据集KITTI&#xff0c;想着在上述两个开源算法上上手跑一下&#xff08;原论文并没有使用KITTI数据集…

【Power Compiler手册】13.UPF多电压设计实现(5)

细化供电集 要重新定义供电集的功能,请使用`create_supply_set`命令的`-update`选项。必须同时使用`-update`和`-function`选项,以将功能名称与供电网络或端口关联起来。 以下示例展示了如何使用`-update`选项将供电网络与供电集的功能关联: create_power_domain PD_TOP c…

【人工智能学习笔记】7_智能语音技术基础

智能语音技术概述 智能语音技术通过对语音进行分析、理解和合成,是计算机设备实现“能听会说”、具备自然语音交流的技术能力。其涉及的范围主要有: 语音合成技术语音识别技术语音测评技术语音降噪与增强技术…智能语音技术的研究内容 智能语音技术的研究难点 智能语音技术…