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;

    @Override
    public void setNextHandler(OrderHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public 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;

    @Override
    public void setNextHandler(OrderHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public 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;

    @Override
    public void setNextHandler(OrderHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public 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;

    @Override
    public void setNextHandler(OrderHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public 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;
    }

    @Override
    public 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、总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(开源)基于Django+Yolov8+Tensorflow的智能鸟类识别平台

1 项目简介&#xff08;开源地址在文章结尾&#xff09; 系统旨在为了帮助鸟类爱好者、学者、动物保护协会等群体更好的了解和保护鸟类动物。用户群体可以通过平台采集野外鸟类的保护动物照片和视频&#xff0c;甄别分类、实况分析鸟类保护动物&#xff0c;与全世界各地的用户&…

算法专题(三):二分查找

本篇还是像之前一样&#xff0c;以举例子的形式向大家讲解&#xff01;每道题的题目均是传送门&#xff01;点击跳转对应题&#xff01; 目录 一、二分查找 1.1 题目 1.2 思路 1.3 代码实现 总结&#xff08;模版&#xff09; 朴素版&#xff1a; 二、在排序数组中查找…

C# OpenCvSharp 部署文档矫正,包括文档扭曲/模糊/阴影等情况

目录 说明 效果 模型 项目 代码 下载 参考 C# OpenCvSharp 部署文档矫正&#xff0c;包括文档扭曲/模糊/阴影等情况 说明 地址&#xff1a;https://github.com/RapidAI/RapidUnDistort 修正文档扭曲/模糊/阴影等情况&#xff0c;使用onnx模型简单轻量部署&#xff0c…

Excel 技巧15 - 在Excel中抠图头像,换背景色(★★)

本文讲了如何在Excel中抠图头像&#xff0c;换背景色。 1&#xff0c;如何在Excel中抠图头像&#xff0c;换背景色 大家都知道在PS中可以很容易抠图头像&#xff0c;换背景色&#xff0c;其实Excel中也可以抠简单的图&#xff0c;换背景色。 ※所用头像图片为百度搜索&#x…

吴恩达深度学习——神经网络介绍

文章内容来自BV11H4y1F7uH&#xff0c;仅为个人学习所用。 文章目录 什么是神经网络引入神经网络神经元激活函数ReLU隐藏单元 用神经网络进行监督学习监督学习与无监督学习举例 什么是神经网络 引入 已经有六个房子的数据集&#xff0c;横轴为房子大小&#xff0c;纵轴为房子…

xctf-comment(Intruder,git恢复,SQL注入,Hex解码)

这题是2018年网鼎杯真题&#xff0c;考察 Burp Suite 的 Intruder 模块去找用户密码&#xff0c;使用 githacker 恢复代码&#xff08;githack不行&#xff09;&#xff0c;代码审计发现SQL二次注入&#xff0c;尝试SQL注入读取文件内容&#xff0c;读取的是/home/www/.bash_hi…

分布式系统通信解决方案:Netty 与 Protobuf 高效应用

分布式系统通信解决方案&#xff1a;Netty 与 Protobuf 高效应用 一、引言 在现代网络编程中&#xff0c;数据的编解码是系统设计的一个核心问题&#xff0c;特别是在高并发和低延迟的应用场景中&#xff0c;如何高效地序列化和传输数据对于系统的性能至关重要。随着分布式系…

C++《AVL树》

在之前的学习当中我们已经了解了二叉搜索树&#xff0c;并且我们知道二叉搜索树的查找效率是无法满足我们的要求&#xff0c;当二叉树为左或者右斜树查找的效率就很低下了&#xff0c;那么这本篇当中我们就要来学习对二叉搜索树进行优化的二叉树——AVL树。在此会先来了解AVL树…

ToDesk设置临时密码和安全密码都可以当做连接密码使用

ToDesk 在各领域办公都已经是非常常见了 为了安全 ToDesk 设置了连接密码&#xff0c;想连接 需要输入远程码和连接密码 我们刚打开 系统默认给我们用的是临时密码&#xff0c;安全性确实很强 和定时Tokey一样&#xff0c;固定时间切换。 但是 如果我们要经常连接这个电脑&a…

LLMs(大型语言模型)的多智能体:Auto-GPT

LLMs(大型语言模型)的多智能体:Auto-GPT 是指在一个系统中集成多个具有不同能力、角色和任务的智能体,这些智能体能够相互协作、沟通和交互,以共同完成复杂的任务或解决复杂的问题。每个智能体都可以被视为一个独立的实体,具有自己的策略、目标和知识库,通过相互之间的…

【Linux环境变量与命令行参数】常见环境变量 | 环境变量的全局属性 | 命令行参数

前言 本文中主要介绍PATH、HOME、SHELL、HISTSIZE这4个环境变量&#xff0c;其中详细介绍PATH。并理解环境变量的全局属性--环境变量可以被子进程继承&#xff0c;这里要注意和C中的继承进行区分。其次&#xff0c;介绍命令行参数--mian函数的参数。 1.环境变量的基本概念 在…

【Python】函数(二)

链式调用 # 判定是否是奇数 def isOdd(num):if num % 2 0:return Falseelse:return Trueresult isOdd(10) print(result)实际上也可以简化写作 print(isOdd(10))把一个函数的返回值, 作为另一个函数的参数, 这种操作称为 链式调用 嵌套调用 函数内部还可以调用其他的函数…

【Elasticsearch 】 聚合分析:桶聚合

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证7)

本文验证基于请求头中传递token信息的认证方式&#xff0c;webapi项目的控制器类中新建如下函数&#xff0c;仅通过验证的客户端能调用&#xff0c;需要客户端请求在Header中添加’Authorization’: Bearer token’的键值对且通过token验证后才能调用。 [Authorize] [HttpGet]…

游戏AI,让AI 玩游戏有什么作用?

让 AI 玩游戏这件事远比我们想象的要早得多。追溯到 1948 年&#xff0c;图灵和同事钱伯恩共同设计了国际象棋程序 Turochamp。之所以设计这么个程序&#xff0c;图灵是想说明&#xff0c;机器理论上能模拟人脑能做的任何事情&#xff0c;包括下棋这样复杂的智力活动。 可惜的是…

9. 神经网络(一.神经元模型)

首先&#xff0c;先看一个简化的生物神经元结构&#xff1a; 生物神经元有多种类型&#xff0c;内部也有复杂的结构&#xff0c;但是可以把单个神经元简化为3部分组成&#xff1a; 树突&#xff1a;一个神经元往往有多个树突&#xff0c;用于接收传入的信息。轴突&#xff1a;…

Docker可视化管理工具Portainer

Portainer简介 Portainer 是一个轻量级的、开源的容器管理工具&#xff0c;提供了一个直观的 Web 用户界面&#xff08;UI&#xff09;&#xff0c;用于管理 Docker 和 Kubernetes 环境。它简化了容器的部署、监控和管理&#xff0c;特别适合不熟悉命令行操作的用户或团队。 …

maven helper插件使用

在intellij idea插件市场搜索maven help并安装安装好后会多一个Dependency Analyzer 场景1&#xff1a;排除某个依赖 点击完exclude pom文件会被修改 然后刷新下maven&#xff0c;相应的依赖就会被排除了。

【VRChat · 改模】Unity2019、2022的版本选择哪个如何决策,功能有何区别;

总览 1.Unity2019、2022的版本的选择 2.Unity添加着色器教程 一、Unity2019、2022的版本的选择 1.Unity2019 和 Unity2022 的区别&#xff0c;VRChat SDK 为何要区分两个版本 我是外行&#xff0c;最开始以为的是&#xff0c;2019 和 2022 的变化是基于这个模型本身的。 也…

RHCE实验详解

目录 实验分析 环境拓扑结构 项目需求 主机环境描述 实验步骤 一、密钥互信和主机名更改 二、DNS 三、NGINX 四、MARIADB 五、NFS 六、NTP 七、论坛服务 结果展示及痛点解答 实验分析 环境拓扑结构 项目需求 1. 172.25.250.101 主机上的 Web 服务要求提供 www.ex…