JAVA:Spring Boot 实现责任链模式处理订单流程的技术指南

1、简述

在复杂的业务系统中,订单流程往往需要一系列的操作,比如验证订单、检查库存、处理支付、更新订单状态等。责任链模式(Chain of Responsibility)可以帮助我们将这些处理步骤分开,并且以链式方式处理每一个操作,从而让代码更加清晰、可扩展和模块化。本文将介绍如何在 Spring Boot 3.3 中使用责任链模式实现订单流程管理。

在这里插入图片描述


2、场景设计

责任链模式是一种行为设计模式,它通过将请求沿着处理者链进行传递,直到其中一个处理者处理该请求为止。在订单处理系统中,我们可以将每个处理步骤(如验证、库存检查、支付)作为一个节点,让请求沿着这些节点传递,直到处理完成。

假设我们的订单系统需要以下几个步骤来处理订单:

  • 验证订单:检查订单信息是否合法。
  • 库存检查:检查商品库存是否足够。
  • 支付处理:处理订单支付。
  • 更新状态:更新订单状态。

这些步骤可以通过责任链模式实现,每个步骤独立为一个处理器,并串联成链来依次执行。


3、代码实现

3.1 定义处理器接口

首先定义 OrderHandler 接口,用于统一订单处理行为。

public interface OrderHandler {void setNextHandler(OrderHandler nextHandler); // 设置下一个处理器void handle(Order order);                      // 处理订单
}
3.2 实现具体处理器

为每个步骤实现对应的处理器,比如 ValidateOrderHandler、InventoryCheckHandler、PaymentHandler 和 StatusUpdateHandler。

import org.springframework.stereotype.Component;// 订单验证处理器
@Component
public class ValidateOrderHandler implements OrderHandler {private OrderHandler nextHandler;@Overridepublic void setNextHandler(OrderHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handle(Order order) {if (order.isValid()) {System.out.println("订单验证通过");if (nextHandler != null) {nextHandler.handle(order);}} else {throw new RuntimeException("订单无效!");}}
}// 库存检查处理器
@Component
public class InventoryCheckHandler implements OrderHandler {private OrderHandler nextHandler;@Overridepublic void setNextHandler(OrderHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handle(Order order) {if (order.hasSufficientInventory()) {System.out.println("库存检查通过");if (nextHandler != null) {nextHandler.handle(order);}} else {throw new RuntimeException("库存不足!");}}
}// 支付处理器
@Component
public class PaymentHandler implements OrderHandler {private OrderHandler nextHandler;@Overridepublic void setNextHandler(OrderHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handle(Order order) {if (order.processPayment()) {System.out.println("支付处理成功");if (nextHandler != null) {nextHandler.handle(order);}} else {throw new RuntimeException("支付失败!");}}
}// 状态更新处理器
@Component
public class StatusUpdateHandler implements OrderHandler {private OrderHandler nextHandler;@Overridepublic void setNextHandler(OrderHandler nextHandler) {this.nextHandler = nextHandler;}@Overridepublic void handle(Order order) {order.updateStatus("完成");System.out.println("订单状态更新成功");if (nextHandler != null) {nextHandler.handle(order);}}
}
3.3 配置责任链

在 Spring Boot 中,通过构造函数注入的方式,将各个处理器链接起来。

import org.springframework.stereotype.Service;
import java.util.List;@Service
public class OrderProcessingService {private final OrderHandler firstHandler;public OrderProcessingService(List<OrderHandler> handlers) {// 构建责任链for (int i = 0; i < handlers.size() - 1; i++) {handlers.get(i).setNextHandler(handlers.get(i + 1));}this.firstHandler = handlers.get(0); // 获取责任链的第一个处理器}public void processOrder(Order order) {firstHandler.handle(order);}
}
3.4 定义 Order 类

创建一个简单的 Order 类用于模拟订单数据。

public class Order {private boolean valid;private boolean sufficientInventory;private boolean paymentProcessed;private String status;// 模拟订单有效性public boolean isValid() { return valid; }public void setValid(boolean valid) { this.valid = valid; }// 模拟库存检查public boolean hasSufficientInventory() { return sufficientInventory; }public void setSufficientInventory(boolean sufficientInventory) {this.sufficientInventory = sufficientInventory;}// 模拟支付处理public boolean processPayment() { return paymentProcessed; }public void setPaymentProcessed(boolean paymentProcessed) {this.paymentProcessed = paymentProcessed;}public void updateStatus(String status) {this.status = status;}public String getStatus() {return status;}
}
3.5 测试责任链

在 OrderProcessingService 中调用 processOrder 方法测试整个订单流程。

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class OrderProcessTestRunner implements CommandLineRunner {private final OrderProcessingService orderProcessingService;public OrderProcessTestRunner(OrderProcessingService orderProcessingService) {this.orderProcessingService = orderProcessingService;}@Overridepublic void run(String... args) throws Exception {Order order = new Order();order.setValid(true);order.setSufficientInventory(true);order.setPaymentProcessed(true);try {orderProcessingService.processOrder(order);System.out.println("订单处理完成,状态:" + order.getStatus());} catch (Exception e) {System.out.println("订单处理失败:" + e.getMessage());}}
}

4、总结

通过责任链模式,订单处理流程中的每个步骤都变成一个独立的处理器,具有良好的模块化和可扩展性。新步骤只需添加新的处理器并将其连接到链中即可,不会影响现有代码。

这种模式在处理复杂流程时非常有效,不仅简化了代码结构,还提高了代码的可读性和维护性。

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

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

相关文章

stm32单片机个人学习笔记14(USART串口数据包)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

postgresql15的启动

PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统&#xff0c;且因为许可证的灵活&#xff0c;任何人都可以以任何目的免费使用、修改和分发PostgreSQL。现在国产数据库大力发展阶段&#xff0c;学习和熟悉postgresql的功能是非常有必要的&#x…

行人识别检测数据集,yolo格式,PASICAL VOC XML,COCO JSON,darknet等格式的标注都支持,准确识别率可达99.5%

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…

【前端】CSS实战之音乐播放器

目录 播放器背景旋转音乐封面按钮进度条音量调节音乐信息按钮的效果JavaScript部分播放和暂停音乐切换音乐信息进度条 音量调节避免拖拽时的杂音音量调节条静音和解除静音 自动下一首实现一个小效果最终效果 播放器背景 <div class"play_box"></div>设置…

SSM开发(一)JAVA,javaEE,spring,springmvc,springboot,SSM,SSH等几个概念区别

目录 JAVA 框架 javaEE spring springmvc springboot SSM SSH maven JAVA 一种面向对象、高级编程语言&#xff0c;Python也是高级编程语言&#xff1b;不是框架(框架&#xff1a;一般用于大型复杂需求项目&#xff0c;用于快速开发)具有三大特性&#xff0c;所谓Jav…

rocketmq基本架构

简介 Name server 负责broker注册、心跳&#xff0c;路由等功能&#xff0c;类似Kafka的ZKname server节点之间不互相通信&#xff0c;broker需要和所有name server进行通信。扩容name server需要重启broker&#xff0c;不然broker不会和name server建立连接producer和consum…

【Web】2025-SUCTF个人wp

目录 SU_blog SU_photogallery SU_POP SU_blog 先是注册功能覆盖admin账号 以admin身份登录&#xff0c;拿到读文件的权限 ./article?filearticles/..././..././..././..././..././..././etc/passwd ./article?filearticles/..././..././..././..././..././..././proc/1…

【优选算法】6----查找总价格为目标值的两个商品

这道题相对于前寄到算法题较为容易~ 同样也是使用了双指针的算法哦~ ----------------------------------------begin-------------------------------------- 题目解析&#xff1a; 题目也是很简单地一句话&#xff0c;但是意图还是很明确~ 讲解算法原理&#xff1a; 同样的&…

github登录用的TOTP和恢复码都丢失了怎么办

从22年左右开始github的登录就需要用TOTP的一个6位秘钥做二次认证登录&#xff0c;如果在用的TOTP软件失效了&#xff0c;可以用github开启二次认证时下载的恢复码重置认证&#xff0c;但是如果你和我一样这两个东西都没了就只能用邮箱重置了&#xff0c;过程给大家分享一下 一…

FFmpeg常用命令

文章目录 一、 FFmpeg 音视频的处理流程二、FFmpeg 常用命令2.1、查看本机支持的采集设备2.2、 录制视频2.2.1、原始视频2.2.2、编码的视频 2.3、录制音频&#xff1a;2.3.1、原始音频2.3.2、编码的音频 2.4、录制音视频&#xff1a;2.5、文件格式转换&#xff1a;2.6、提取音频…

30天开发操作系统 第 17 天 -- 命令行窗口

前言 今天一开始&#xff0c;请大家先回忆一下任务A的情形。在harib13e中&#xff0c;任务A下面的LEVEL中有任务因此FIFO为空时我们可以让任务A进入休眠状态。那么&#xff0c;如果我们并未启动任务B0~ B0~ B2, B2的话&#xff0c;任务A又将会如何呢&#xff1f; 首先&#xf…

OpenEuler学习笔记(九):安装 OpenEuler后配置和优化

安装OpenEuler后&#xff0c;可以从系统基础设置、网络配置、性能优化等方面进行配置和优化&#xff0c;以下是具体内容&#xff1a; 系统基础设置 更新系统&#xff1a;以root用户登录系统后&#xff0c;在终端中执行sudo yum update命令&#xff0c;对系统进行更新&#x…

网络安全 | 入侵检测系统(IDS)与入侵防御系统(IPS):如何识别并阻止威胁

网络安全 | 入侵检测系统&#xff08;IDS&#xff09;与入侵防御系统&#xff08;IPS&#xff09;&#xff1a;如何识别并阻止威胁 一、前言二、入侵检测系统&#xff08;IDS&#xff09;2.1 IDS 的工作原理2.2 IDS 的技术类型2.3 IDS 的部署方式 三、入侵防御系统&#xff08;…

数学规划问题2 .有代码(非线性规划模型,最大最小化模型,多目标规划模型)

非线性规划模型 FIrst:转化为标准型 在matlab中求非线性规划的函数 练习题: 典型例题: 最大最小化模型 核心思想&#xff1a; matlab的模型求解 经典例题: 多目标规划模型 基本概念 求解思路: 模型构建步骤 经典例题: 非线性规划模型 非线性规划&#xff08;Nonl…

2025年最新深度学习环境搭建:Win11+ cuDNN + CUDA + Pytorch +深度学习环境配置保姆级教程

本文目录 一、查看驱动版本1.1 查看显卡驱动1.2 显卡驱动和CUDA对应版本1.3 Pytorch和Python对应的版本1.4 Pytorch和CUDA对应的版本 二、安装CUDA三、安装cuDANN四、安装pytorch五、验证是否安装成功 一、查看驱动版本 1.1 查看显卡驱动 输入命令nvidia-smi可以查看对应的驱…

Transformer详解:Attention机制原理

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;本系列文章是作者参加DataWhale2025年1月份学习赛&#xff0c;旨在讲解Transformer模型的理论和实践。&#x1f632; 本文将详细探讨Attention机制的原理…

npm install 报错:Command failed: git checkout 2.2.0-c

[TOC](npm install 报错&#xff1a;Command failed: git checkout 2.2.0-c) npm install 报错&#xff1a;Command failed: git checkout 2.2.0-c export NODE_HOME/usr/local/node-v14.14.0-linux-x64 npm config set registry https://registry.npmmirror.com 使用如上环…

从对等通信到万维网:通信模型变迁与拥塞求解

Leonard Kleinrock&#xff1a;我很清楚用不了多久这些计算机就会有相互通信的需求&#xff0c;但如何协调处理这些分时系统概率性产生的分组(不同于电路交换)&#xff0c;却没有有效的方法&#xff0c;我有处理该问题的方法&#xff0c;因此对于我的博士研究&#xff0c;我决定…

【Vim Masterclass 笔记21】S09L39:Vim 设置与 vimrc 文件的用法示例(二)

文章目录 S09L39 Vim Settings and the Vimrc File - Part 21 Vim 的配色方案与 color 命令2 map 命令3 示例&#xff1a;用 map 命令快速生成 HTML 代码片段4 Vim 中的 Leader 键5 用 mkvimrc 命令自动生成配置文件 写在前面 本篇为 Vim 自定义配置的第二部分。当中的每个知识…

Debian 上安装PHP

1、安装软件源拓展工具 apt -y install software-properties-common apt-transport-https lsb-release ca-certificates 2、添加 Ondřej Sur 的 PHP PPA 源&#xff0c;需要按一次回车&#xff1a; add-apt-repository ppa:ondrej/php 3、更新软件源缓存&#xff1a; apt-g…