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

SpringBoot里,什么是状态机?在商城系统的订单管理业务上如何应用?

什么是状态机?

状态机(State Machine)是一种数学模型,用于描述系统在不同状态间的转换。它由以下部分组成:

  1. 状态(State):系统可能处于的各个状态。
  2. 事件(Event):触发状态转换的动作或条件。
  3. 转换(Transition):事件触发后,系统从一个状态转移到另一个状态的过程。
  4. 动作(Action):状态转换时执行的操作。

状态机分为有限状态机(FSM)和无限状态机,Spring Boot 中常用的是有限状态机。

状态机在订单管理中的应用

在商城系统中,订单状态通常包括:待支付已支付已发货已收货已完成已取消等。状态机可以清晰地管理这些状态及其转换。

1. 定义订单状态和事件
  • 状态

    • 待支付(PENDING_PAYMENT)
    • 已支付(PAID)
    • 已发货(SHIPPED)
    • 已收货(RECEIVED)
    • 已完成(COMPLETED)
    • 已取消(CANCELLED)
  • 事件

    • 支付(PAY)
    • 发货(SHIP)
    • 确认收货(RECEIVE)
    • 完成订单(COMPLETE)
    • 取消订单(CANCEL)
2. 状态转换规则
  • 待支付已支付(支付事件)
  • 已支付已发货(发货事件)
  • 已发货已收货(确认收货事件)
  • 已收货已完成(完成订单事件)
  • 待支付已取消(取消订单事件)
  • 已支付已取消(取消订单事件)
3. 实现状态机

在 Spring Boot 中,可以使用 Spring State Machine 来实现状态机。

3.1 添加依赖
<dependency>
    <groupId>org.springframework.statemachine</groupId>
    <artifactId>spring-statemachine-core</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>
3.2 定义状态和事件
public enum OrderStates {
    PENDING_PAYMENT, PAID, SHIPPED, RECEIVED, COMPLETED, CANCELLED
}

public enum OrderEvents {
    PAY, SHIP, RECEIVE, COMPLETE, CANCEL
}
3.3 配置状态机
@Configuration
@EnableStateMachine
public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<OrderStates, OrderEvents> {

    @Override
    public void configure(StateMachineStateConfigurer<OrderStates, OrderEvents> states) throws Exception {
        states
            .withStates()
            .initial(OrderStates.PENDING_PAYMENT)
            .states(EnumSet.allOf(OrderStates.class));
    }

    @Override
    public void configure(StateMachineTransitionConfigurer<OrderStates, OrderEvents> transitions) throws Exception {
        transitions
            .withExternal()
                .source(OrderStates.PENDING_PAYMENT).target(OrderStates.PAID).event(OrderEvents.PAY)
            .and()
            .withExternal()
                .source(OrderStates.PAID).target(OrderStates.SHIPPED).event(OrderEvents.SHIP)
            .and()
            .withExternal()
                .source(OrderStates.SHIPPED).target(OrderStates.RECEIVED).event(OrderEvents.RECEIVE)
            .and()
            .withExternal()
                .source(OrderStates.RECEIVED).target(OrderStates.COMPLETED).event(OrderEvents.COMPLETE)
            .and()
            .withExternal()
                .source(OrderStates.PENDING_PAYMENT).target(OrderStates.CANCELLED).event(OrderEvents.CANCEL)
            .and()
            .withExternal()
                .source(OrderStates.PAID).target(OrderStates.CANCELLED).event(OrderEvents.CANCEL);
    }
}
3.4 使用状态机
@Service
public class OrderService {

    @Autowired
    private StateMachine<OrderStates, OrderEvents> stateMachine;

    public void payOrder() {
        stateMachine.sendEvent(OrderEvents.PAY);
    }

    public void shipOrder() {
        stateMachine.sendEvent(OrderEvents.SHIP);
    }

    public void receiveOrder() {
        stateMachine.sendEvent(OrderEvents.RECEIVE);
    }

    public void completeOrder() {
        stateMachine.sendEvent(OrderEvents.COMPLETE);
    }

    public void cancelOrder() {
        stateMachine.sendEvent(OrderEvents.CANCEL);
    }
}

总结

状态机在订单管理中能有效管理状态转换,确保订单状态按预期流转。通过 Spring State Machine,可以简化状态机的实现,提升代码的可维护性和可读性。

相关文章:

  • golang下载安装图文教程(Linux环境)
  • 机器学习 - 理论和定理
  • 前端骨架怎样实现
  • 【DeepSeek】DeepSeek概述 | 本地部署deepseek
  • DeepSeek笔记(一):本地部署DeepSeek R1并搭建Web UI实现可视化交互的笔记
  • 开源模型应用落地-Qwen1.5-MoE-A2.7B-Chat与vllm实现推理加速的正确姿势(一)
  • GPT 系列模型发展史:从 GPT 到 ChatGPT 的演进与技术细节
  • STM32 裸机 C编程 vs micropython编程 vs linux python
  • 【Linux】网络基础
  • 西安电子科技大学考研成绩2月24号即可查询,成绩查询入口:
  • Spring Boot比Spring多哪些注解?
  • 漏洞挖掘 | 基于mssql数据库的sql注入
  • Linux(Centos 7.6)命令详解:head
  • 安装并配置 MySQL
  • 大数据、人工智能、云计算、物联网、区块链序言【大数据导论】
  • Repo命令使用
  • 【Elasticsearch】token filter分词过滤器
  • MongoDB 扩缩容实战:涵盖节点配置、服务启动与移除操作
  • Centos7安装Tesseract5.5.0+SpringBoot集成部署(离线版)
  • 初识计算机网络
  • 海航回应“男团粉丝为追星堵住机舱通道”:已紧急阻止
  • 中国海外发展:今年前4个月销售665.8亿元,花费305亿元拿地
  • 湖北宜昌:在青山绿水间解锁乡村振兴“密码”
  • 涨知识|没想到吧,体育老师强调的运动恢复方法是错的?
  • 75岁亚当·费舍尔坐镇,再现80分钟马勒《第九交响曲》
  • 国家主席习近平同普京总统出席签字和合作文本交换仪式