Solon StateMachine 实现状态机使用示例详解
什么是状态机
状态机是计算机科学中的核心建模工具,用于描述对象在其生命周期内状态变化的逻辑模型。它通过定义有限状态集合、状态转移规则和触发事件,精确控制系统的行为逻辑。
Solon StateMachine 是 Solon Framework 提供的一个功能强大的状态机框架,可实现复杂的工作流、订单管理等需要状态流转的场景。通过对状态、事件和转移的管理,开发者能够构建出简洁而灵活的状态机逻辑。
使用示例
1、导入maven依赖
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-statemachine</artifactId>
<version>3.5.0</version>
</dependency>
2、创建订单状态枚举类
import org.noear.solon.statemachine.State;
public enum OrderStatus implements State{
WAITING_PAYMENT,//待支付
WAITING_RECEIVE,//待取货
FINISHED,//已完成
CANCELED;//已取消
}
3、创建订单转悠事件枚举类
import org.noear.solon.statemachine.Event;
public enum OrderEvent implements Event {
CREATE_ORDER,//创建订单
PAY_ORDER,//支付订单
RECEIVE_ORDER,//取货
CANCEL_ORDER,//取消订单
FINISH_ORDER//完成订单
}
4、创建订单实体,并实现 EventContext 接口(也可以不实现,改用 EventContext.of(...))
public class Order implements EventContext<OrderStatus, Order> {
private final String orderId;
private OrderStatus status;
public Order(String orderId, OrderStatus status) {
this.orderId = orderId;
this.status = status;
}
public String getOrderId() {
return orderId;
}
public OrderStatus getStatus() {
return status;
}
public void setStatus(OrderStatus status) {
this.status = status;
}
// for EventContext
@Override
public OrderStatus getCurrentState() {
return status;
}
@Override
public Order getPayload() {
return this;
}
}
5、定义订单状态机组件,并添加状态转移规则。这里是重点了
Solon StateMachine 不管理当前状态,不涉及持久化。具有可复用、多线程安全特性。
import org.noear.solon.annotation.Managed;
import org.noear.solon.statemachine.StateMachine;
@Managed
public class OrderStateMachine extends StateMachine<OrderStatus, OrderEvent,Order> {
public OrderStateMachine() {
// 订单待支付 -> 待取货
addTransition(t -> t
.from(OrderStatus.WAITING_PAYMENT)
.to(OrderStatus.WAITING_RECEIVE)
.on(OrderEvent.PAY_ORDER)
.then(c -> c.getPayload().setStatus(c.getTo())));
// 订单待取货 -> 已完成
addTransition(t -> t
.from(OrderStatus.WAITING_RECEIVE)
.to(OrderStatus.FINISHED)
.on(OrderEvent.FINISH_ORDER)
.then(c -> c.getPayload().setStatus(c.getTo())));
// 订单待支付 -> 已取消
addTransition(t -> t
.from(OrderStatus.WAITING_PAYMENT)
.to(OrderStatus.CANCELED)
.on(OrderEvent.CANCEL_ORDER)
.then(c -> c.getPayload().setStatus(c.getTo())));
}
}
6、创建调用示例服务
Solon StateMachine 在发送事件时,通过 EventContext 传递当前状态和装载。
@Managed
public class OrderService {
@Inject
private OrderStateMachine orderStateMachine;
//支付
public Order pay() {
Order order = new Order("1", OrderStatus.WAITING_RECEIVE);
System.out.println("尝试支付,订单号:" + order.getOrderId());
try {
//事件: 支付, 状态转换:待支付 → 待发货
orderStateMachine.sendEvent(OrderEvent.PAY_ORDER, order);
System.out.println("支付成功,订单号:" + order.getOrderId());
} catch (Exception ex) {
System.out.println("支付失败, 状态异常,订单号:" + order.getOrderId());
}
return order;
}
}
Solon StateMachine 实现状态机使用示例详解的更多相关文章
- jquery移除、绑定、触发元素事件使用示例详解
这篇文章主要介绍了jquery移除.绑定.触发元素事件使用示例详解,需要的朋友可以参考下. unbind(type [,data]) //data是要移除的函数 $('#btn').unbind(&q ...
- gcc与g++的编译链接的示例详解
一.编译方式的示例详解 1. 编译C代码 代码如下:main.c /*! ************************************************************** ...
- 史上最易懂——ReactNative分组列表SectionList使用详情及示例详解
React Native系列 <逻辑性最强的React Native环境搭建与调试> <ReactNative开发工具有这一篇足矣> <解决React Native un ...
- Spring Boot 2.x 快速入门(下)HelloWorld示例详解
上篇 Spring Boot 2.x 快速入门(上)HelloWorld示例 进行了Sprint Boot的快速入门,以实际的示例代码来练手,总比光看书要强很多嘛,最好的就是边看.边写.边记.边展示. ...
- VS2010 Chart控件(一)Chart控件在ASP.NET网站中的应用示例详解(C#语言)
步骤如下: 1. Chart控件(一)Chart控件在ASP.NET网站中的应用示例详解(C#语言)" title="VS2010 Chart控件(一)Chart控件在ASP.NE ...
- socket编程的同步、异步与阻塞、非阻塞示例详解
socket编程的同步.异步与阻塞.非阻塞示例详解之一 分类: 架构设计与优化 简介图 1. 基本 Linux I/O 模型的简单矩阵 每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序 ...
- String.format()【示例详解】
String.format()[示例详解] 整理者:Vashon 前言: String.format 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能,为了不止步于简单调用 String.fo ...
- SpringBoot与PageHelper的整合示例详解
SpringBoot与PageHelper的整合示例详解 1.PageHelper简介 PageHelper官网地址: https://pagehelper.github.io/ 摘要: com.gi ...
- python中的tcp示例详解
python中的tcp示例详解 目录 TCP简介 TCP介绍 TCP特点 TCP与UDP的不同点 udp通信模型 tcp客户端 tcp服务器 tcp注意点 TCP简介 TCP介绍 TCP协议 ...
- 在java poi导入Excel通用工具类示例详解
转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36 作者:daochuwenziyao 我要评论 这篇文章主要给大家介绍了关于在j ...
随机推荐
- Chester1011的疑问
题目背景 一天,\(\texttt{Chester}\)和\(\texttt{hsh}\)在写数据结构题. 他们开始刷起了羊毛地毯.在羊毛地毯的落地点,有一个漏斗.漏斗下面会经过漏斗矿车,每次只能吸走 ...
- java练习题之String字符串
1 编写程序将"jdk" 全部变成大写 并输出到屏幕 截取"DK"并输出到屏幕 1 package com.lv.study.am.first; 2 3 pu ...
- 生活中有苦难却没有人可以倾述?来看看AI树洞吧!
本文由 ChatMoney团队出品 介绍说明 在如今繁忙喧嚣的世界中,我们时常渴望能有一个安全且私密的空间,让我们毫无顾忌地袒露心声.AI 智能体树洞便是这样一个独特的存在. 它并非传统意义上的树洞, ...
- ChatMoney让你不再恋爱脑!
本文由 ChatMoney团队出品 你是否曾经想过,为什么我们会在恋爱中变得如此"上头",仿佛整个世界都围绕着那个TA旋转? 恋爱脑,通常是指一个人在恋爱中过度投入.过度依赖对方, ...
- ET框架对MongoDB的使用
一:本地测试: 1:加载DB组件 2:调整用户ID : C2G_LoginGateHandler中创建玩家时id调整.(每次重启服务端创建小人ID是一样的,插入数据库会覆盖掉上传插入的数据) 3:在 ...
- C# 将一个 List分成三个 List,每个包含指定的数量
我们可以使用 LINQ 中的 GroupBy 方法.首先,我们需要将原始列表分成大小为100的块,然后将这些块分组到三个列表中.以下是实现此操作的代码示例: using System.Linq; ...
- C# 添加一个具有自定义命名空间和相同类名的静态类:Console
using CLRConsole = System.Console; namespace ExtensionMethodsDemo { public static class Console { pu ...
- 关于 winform Dev 使用的总结
treeList控件 1.去除树的头一行:属性–OptionsView–ShowColumns 设为fakse 2.去除树最左列的鼠标箭头列:属性–OptionsView–ShowIndicator设 ...
- Educational Codeforces Round 96 ABCDE 题解(详解)
A. Number of Apartments 题意:用3.5.7凑数,若能凑出给出方案,不能则输出-1. 思路:观察发现除了1 2 4凑不到以外其他都凑得到.那么关于方案的话,既然其他数都凑得到,我 ...
- C++11 功能函数小结
简介 C++11 引进了很多集合函数, 在功能更加强大的同时, 也越发复杂. 参考链接 https://blog.csdn.net/qq_40160605/article/details/801502 ...