当前位置: 首页 > news >正文

基于责任链模式进行订单参数的校验

目录

概念

总体分为三步

我们定义责任链模式接口

各个节点的具体逻辑

用户校验器

库存校验器

商品校验器

把责任链编排在一起


概念

责任链模式 是一种行为设计模式

可以通过将一系列处理器按照顺序连接起来

使每个处理器都有机会处理请求

我理解的责任链的实现类似于链表

每个节点跑向下一个节点 执行逻辑后

总体分为三步

  1. 定义责任链接口validator
  2. 实现责任链接口后写不同责任链实现类
  3. 使用一个validatorConfig把不同责任链编排在一起

我们定义责任链模式接口

我们接口中有三个方法

设置下一个校验器

返回下一个校验器

校验逻辑接口

package cn.hollis.nft.turbo.order.validator;import cn.hollis.nft.turbo.api.order.request.OrderCreateRequest;
import cn.hollis.nft.turbo.order.OrderException;/*** 订单校验* 责任链模式* @author Hollis*/
public interface OrderCreateValidator {/*** 设置下一个校验器** @param nextValidator*/public void setNext(OrderCreateValidator nextValidator);/*** 返回下一个校验器** @return*/public OrderCreateValidator getNext();/*** 校验** @param request* @throws OrderException 订单异常*/public void validate(OrderCreateRequest request) throws OrderException;
}

这边使用了模版方法的设计模式进行了二次封装

package cn.hollis.nft.turbo.order.validator;import cn.hollis.nft.turbo.api.order.request.OrderCreateRequest;
import cn.hollis.nft.turbo.order.OrderException;/*** 订单校验** @author Hollis*/
public abstract class BaseOrderCreateValidator implements OrderCreateValidator {protected OrderCreateValidator nextValidator;@Overridepublic void setNext(OrderCreateValidator nextValidator) {this.nextValidator = nextValidator;}@Overridepublic OrderCreateValidator getNext() {return nextValidator;}/*** 校验** @param request* @throws Exception*/@Overridepublic void validate(OrderCreateRequest request) throws OrderException {doValidate(request);if (nextValidator != null) {nextValidator.validate(request);}}/*** 校验方法的具体实现** @param request* @throws OrderException*/protected abstract void doValidate(OrderCreateRequest request) throws OrderException;
}

各个节点的具体逻辑

用户校验器

package cn.hollis.nft.turbo.order.validator;import cn.hollis.nft.turbo.api.order.request.OrderCreateRequest;
import cn.hollis.nft.turbo.api.user.constant.UserRole;
import cn.hollis.nft.turbo.api.user.constant.UserStateEnum;
import cn.hollis.nft.turbo.api.user.request.UserQueryRequest;
import cn.hollis.nft.turbo.api.user.response.UserQueryResponse;
import cn.hollis.nft.turbo.api.user.response.data.UserInfo;
import cn.hollis.nft.turbo.api.user.service.UserFacadeService;
import cn.hollis.nft.turbo.order.OrderException;import static cn.hollis.nft.turbo.api.order.constant.OrderErrorCode.*;/*** 用户校验器,继承自 BaseOrderCreateValidator,用于校验订单创建请求中的买家信息。* 主要校验买家的角色、状态以及认证情况,若不符合要求则抛出相应的订单异常。** @author hollis*/
public class UserValidator extends BaseOrderCreateValidator {/*** 用户服务接口,用于查询用户信息。*/private UserFacadeService userFacadeService;/*** 实现父类的抽象方法,对订单创建请求中的买家信息进行校验。** @param request 订单创建请求对象,包含买家信息。* @throws OrderException 当买家信息不符合要求时,抛出相应的订单异常。*/@Overridepublic void doValidate(OrderCreateRequest request) throws OrderException {// 从订单创建请求中获取买家 IDString buyerId = request.getBuyerId();// 创建用户查询请求对象,将买家 ID 转换为 Long 类型UserQueryRequest userQueryRequest = new UserQueryRequest(Long.valueOf(buyerId));// 调用用户服务接口查询买家信息UserQueryResponse<UserInfo> userQueryResponse = userFacadeService.query(userQueryRequest);// 若用户查询成功且返回的用户信息不为空if (userQueryResponse.getSuccess() && userQueryResponse.getData() != null) {// 获取用户信息对象UserInfo userInfo = userQueryResponse.getData();// 校验买家角色,若买家角色不为普通用户,则抛出买家为平台用户异常if (userInfo.getUserRole() != null && !userInfo.getUserRole().equals(UserRole.CUSTOMER)) {throw new OrderException(BUYER_IS_PLATFORM_USER);}// 判断买家状态,若买家状态不为激活状态,则抛出买家状态异常if (userInfo.getState() != null && !userInfo.getState().equals(UserStateEnum.ACTIVE.name())) {throw new OrderException(BUYER_STATUS_ABNORMAL);}// 判断买家认证情况,若买家未认证,则抛出买家未认证异常if (userInfo.getState() != null && !userInfo.getCertification()) {throw new OrderException(BUYER_NOT_AUTH);}}}/*** 有参构造函数,用于注入用户服务接口。** @param userFacadeService 用户服务接口实例,用于查询用户信息。*/public UserValidator(UserFacadeService userFacadeService) {this.userFacadeService = userFacadeService;}/*** 无参构造函数。* 注意:此构造函数未被使用,若后续无使用需求可考虑移除。*/public UserValidator() {}
}

库存校验器

package cn.hollis.nft.turbo.order.validator;import cn.hollis.nft.turbo.api.inventory.request.InventoryRequest;
import cn.hollis.nft.turbo.api.inventory.service.InventoryFacadeService;
import cn.hollis.nft.turbo.api.order.request.OrderCreateRequest;
import cn.hollis.nft.turbo.base.response.SingleResponse;
import cn.hollis.nft.turbo.order.OrderException;import static cn.hollis.nft.turbo.api.order.constant.OrderErrorCode.INVENTORY_NOT_ENOUGH;/*** 库存校验器,继承自 BaseOrderCreateValidator,用于在订单创建时校验商品库存是否充足。* 如果库存不足,将抛出相应的订单异常。** @author hollis*/
public class StockValidator extends BaseOrderCreateValidator {/*** 库存服务接口,用于查询商品库存信息。*/private InventoryFacadeService inventoryFacadeService;/*** 实现父类的抽象方法,对订单创建请求进行库存校验。** @param request 订单创建请求对象,包含商品相关信息。* @throws OrderException 当库存不足时,抛出库存不足的订单异常。*/@Overridepublic void doValidate(OrderCreateRequest request) throws OrderException {// 创建库存查询请求对象InventoryRequest inventoryRequest = new InventoryRequest();// 设置要查询的商品 IDinventoryRequest.setGoodsId(request.getGoodsId());// 设置要查询的商品类型inventoryRequest.setGoodsType(request.getGoodsType());// 设置要查询的商品标识inventoryRequest.setIdentifier(request.getIdentifier());// 设置要查询的商品数量,即订单中请求的商品数量inventoryRequest.setInventory(request.getItemCount());// 调用库存服务接口查询商品库存SingleResponse<Integer> response = inventoryFacadeService.queryInventory(inventoryRequest);// 如果库存查询失败if (!response.getSuccess()) {// 抛出库存不足的订单异常throw new OrderException(INVENTORY_NOT_ENOUGH);}// 获取查询到的商品库存数量Integer inventory = response.getData();// 如果库存数量为 0if (inventory == 0) {// 抛出库存不足的订单异常throw new OrderException(INVENTORY_NOT_ENOUGH);}// 如果库存数量小于订单请求的商品数量if (inventory < request.getItemCount()) {// 抛出库存不足的订单异常throw new OrderException(INVENTORY_NOT_ENOUGH);}}/*** 有参构造函数,用于注入库存服务接口。** @param inventoryFacadeService 库存服务接口实例,用于查询商品库存信息。*/public StockValidator(InventoryFacadeService inventoryFacadeService) {this.inventoryFacadeService = inventoryFacadeService;}/*** 无参构造函数。* 注意:此构造函数未初始化 inventoryFacadeService,若使用可能会导致空指针异常,建议根据实际情况移除或完善。*/public StockValidator() {}
}

商品校验器

package cn.hollis.nft.turbo.order.validator;import cn.hollis.nft.turbo.api.goods.constant.GoodsState;
import cn.hollis.nft.turbo.api.goods.model.BaseGoodsVO;
import cn.hollis.nft.turbo.api.goods.service.GoodsFacadeService;
import cn.hollis.nft.turbo.api.order.request.OrderCreateRequest;
import cn.hollis.nft.turbo.order.OrderException;import static cn.hollis.nft.turbo.api.order.constant.OrderErrorCode.GOODS_NOT_AVAILABLE;
import static cn.hollis.nft.turbo.api.order.constant.OrderErrorCode.GOODS_PRICE_CHANGED;/*** 商品校验器,继承自 BaseOrderCreateValidator,用于在订单创建时校验商品状态和价格。* 若商品不可售或价格发生变化,则抛出相应的订单异常。** @author hollis*/
public class GoodsValidator extends BaseOrderCreateValidator {/*** 商品服务接口,用于获取商品信息。*/private GoodsFacadeService goodsFacadeService;/*** 实现父类的抽象方法,对订单创建请求中的商品信息进行校验。** @param request 订单创建请求对象,包含商品 ID、商品类型和商品价格等信息。* @throws OrderException 当商品不可售或商品价格发生变化时,抛出相应的订单异常。*/@Overrideprotected void doValidate(OrderCreateRequest request) throws OrderException {// 调用商品服务接口,根据订单请求中的商品 ID 和商品类型获取商品信息BaseGoodsVO baseGoodsVO = goodsFacadeService.getGoods(request.getGoodsId(), request.getGoodsType());// 如果商品状态既不是在售状态,也不是已售罄状态,则认为商品不可售// 说明:包含 SOLD_OUT 状态是因为商品查询接口会获取 Redis 中的最新库存,// 下单时 Redis 库存可能已扣减至 0if (baseGoodsVO.getState() != GoodsState.SELLING && baseGoodsVO.getState() != GoodsState.SOLD_OUT) {// 抛出商品不可售的订单异常throw new OrderException(GOODS_NOT_AVAILABLE);}// 比较商品的实际价格和订单请求中的商品价格if (baseGoodsVO.getPrice().compareTo(request.getItemPrice()) != 0) {// 若价格不一致,抛出商品价格已变更的订单异常throw new OrderException(GOODS_PRICE_CHANGED);}}/*** 有参构造函数,用于注入商品服务接口。** @param goodsFacadeService 商品服务接口实例,用于获取商品信息。*/public GoodsValidator(GoodsFacadeService goodsFacadeService) {this.goodsFacadeService = goodsFacadeService;}/*** 无参构造函数。* 注意:此构造函数未初始化 goodsFacadeService,使用时可能会导致空指针异常,* 若后续无使用需求,可考虑移除。*/public GoodsValidator() {}
}

把责任链编排在一起

调用每一个责任链节点的setNext方法

把下一个责任链节点对象放进去

类似于调用链表的set方法

package cn.hollis.nft.turbo.order.domain.validator;import cn.hollis.nft.turbo.order.validator.GoodsBookValidator;
import cn.hollis.nft.turbo.order.validator.GoodsValidator;
import cn.hollis.nft.turbo.order.validator.OrderCreateValidator;
import cn.hollis.nft.turbo.order.validator.UserValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 订单创建校验器配置** @author hollis*/
@Configuration
public class OrderCreateValidatorConfig {@Autowiredprivate GoodsValidator goodsValidator;@Autowiredprivate UserValidator userValidator;@Autowiredprivate GoodsBookValidator goodsBookValidator;@Beanpublic OrderCreateValidator orderValidatorChain() {userValidator.setNext(goodsValidator);goodsValidator.setNext(goodsBookValidator);return userValidator;}
}

http://www.lqws.cn/news/163513.html

相关文章:

  • 自动化办公集成工具:一站式解决文档处理难题
  • React Router 中 navigate 后浏览器返回按钮不起作用的问题记录
  • React Hooks 基础指南
  • 如果科技足够发达,是否还需要维持自然系统(例如生物多样性)中那种‘冗余’和‘多样性’,还是可以只保留最优解?
  • Python数据可视化科技图表绘制系列教程(四)
  • 动静态库的使用(Linux下)
  • 好得睐:以品质守味、以科技筑基,传递便捷与品质
  • Cilium动手实验室: 精通之旅---6.Cilium IPv6 Networking and Observability - Lab
  • 【2025年】解决Burpsuite抓不到https包的问题
  • 灵活控制,modbus tcp转ethernetip的 多功能水处理方案
  • 兰亭妙微 | 医疗软件的界面设计能有多专业?
  • 【QT】显示类控件
  • three.js中使用tween.js的chain实现动画依次执行
  • Python训练营打卡Day45
  • 【LLIE专题】NTIRE 2025 低照度图像增强第二名方案
  • Chrome密码和自动填充突然都没了
  • 【Oracle】分区表
  • CppCon 2015 学习:CLANG/C2 for Windows
  • 什么是DevOps智能平台的核心功能?
  • uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
  • 编程技能:格式化打印05,格式控制符
  • 通过SAE实现企业应用的云上托管
  • std__map,std__unordered_map,protobuf__map之间的性能比较
  • 【git】把本地更改提交远程新分支feature_g
  • [蓝桥杯]耐摔指数
  • word公式_latex
  • 【西门子杯工业嵌入式-2-点亮一颗LED】
  • 2024年09月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 基于红黑树的插入功能,对Set和Map部分功能进行封装实现
  • Python训练第四十五天