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

springboot:责任链模式实现多级校验

责任链模式是将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护一个下一节点对象。
当一个请求从链式的首段发出时,会沿着链的路径依此传递给每一个节点对象,直至有对象处理这个请求为止。
属于行为型模式。

1、定义处理器接口

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Order {private Integer creditScore;private Integer quantity;
}
public interface OrderHandler {boolean handle(Order order);
}

2、实现不同的校验处理器
信用校验处理器:

@Component
public class CreditHandler implements OrderHandler{@Overridepublic boolean handle(Order order) {if (order.getCreditScore() % 2 != 0){System.out.println("信用不足");return false;}return true;}
}

库存校验处理器:

@Component
public class StockHandler implements OrderHandler{@Overridepublic boolean handle(Order order) {if (order.getQuantity() > 20){System.out.println("库存不足");return false;}return true;}
}

3、责任链管理器

@Component
public class OrderHandlerChain {private final List<OrderHandler> handlers;public OrderHandlerChain(List<OrderHandler> handlers){this.handlers = handlers;}public boolean process(Order order){for (OrderHandler handler : handlers) {if (!handler.handle(order)){return false;}}return true;}
}

4、服务类调用责任链

@Component
public class OrderService {private final OrderHandlerChain handlerChain;private OrderService(OrderHandlerChain handlerChain){this.handlerChain = handlerChain;}public boolean processOrder(Order order){boolean process = handlerChain.process(order);if (process){System.out.println("校验成功");}return process;}
}

5、测试

@SpringBootTest
public class OrderServiceTest {@Autowiredprivate OrderService orderService;@Testpublic void testOrderProcess(){Order order = new Order(2, 5);orderService.processOrder(order);Order order1 = new Order(2, 5);orderService.processOrder(order1);Order order2 = new Order(2, 21);orderService.processOrder(order2);}}

6、优点

  • 解耦逻辑:每个校验逻辑独立实现,符合单一职责原则
  • 灵活扩展:新增校验只需添加新的Handler实现类,无需修改现有代码
  • 支持动态调整:可通过调整List的顺序来改变校验顺序
  • 利用Spring自动装配:使用Spring的依赖注入简化责任链构建
http://www.lryc.cn/news/488620.html

相关文章:

  • CentO7安装单节点Redis服务
  • FreeRTOS学习14——时间管理
  • 统⼀数据返回格式快速⼊⻔
  • Python学习------第十天
  • Win11 24H2新BUG或影响30%CPU性能,修复方法在这里
  • element ui 走马灯一页展示多个数据实现
  • 40分钟学 Go 语言高并发:Goroutine基础与原理
  • Figma插件指南:12款提升设计生产力的插件
  • 【K8S系列】Kubernetes集群资源管理与调度 深度分析
  • delphi fmx android 离线人脸识别
  • Linux mountpoint 命令详解
  • Linux驱动开发(9):pinctrl子系统和gpio子系统--led实验
  • 用sqlmap工具打sqli-labs前20关靶场
  • 代码随想录算法训练营第二十一天 | 93.复原IP地址 | 78.子集
  • #Uniapp篇:支持纯血鸿蒙发布适配UIUI
  • 边缘提取函数 [OPENCV--2]
  • 插值原理(数值计算方法)
  • 【Pikachu】SSRF(Server-Side Request Forgery)服务器端请求伪造实战
  • IDEA怎么定位java类所用maven依赖版本及引用位置
  • Discuz论坛网站管理员的默认用户名admin怎么修改啊?
  • BIO、NIO、AIO的区别?
  • 音视频入门基础:MPEG2-TS专题(7)——FFmpeg源码中,读取出一个transport packet数据的实现
  • Flutter中sqflite的使用案例
  • 【2024 Optimal Control 16-745】【Lecture 2】integrators.ipynb功能分析
  • 【linux】ubuntu下常用快捷键【笔记】
  • 【Linux】常用命令练习
  • 力扣-Hot100-数组【算法学习day.37】
  • 表格不同类型的数据如何向量化?
  • 成都栩熙酷,电商服务新选择
  • 【java基础】微服务篇