分钟带你体验 Solon 的状态机
分钟带你体验 Solon 的状态机在现代应用开发中状态机是一种常见的设计模式用于管理对象的状态转换逻辑。无论是游戏开发中的角色状态、订单系统中的订单状态还是工作流中的任务状态状态机都能帮助我们清晰地组织代码、减少逻辑混乱。今天我们将深入探讨 Solon 框架中的状态机实现通过原理剖析和代码示例让你在几分钟内快速上手。## 什么是状态机状态机State Machine是一个数学模型由一组状态State、一组事件Event和转移规则Transition组成。状态机在任意时刻处于一个状态当接收到事件时根据当前状态和事件决定下一个状态并可能执行相应的动作。状态机的核心优势在于-可预测性状态转换由规则定义避免了条件判断的混乱。-可维护性状态逻辑集中管理易于扩展和修改。-可测试性每个状态和转换可以独立测试。## Solon 状态机原理剖析Solon 是一个轻量级的 Java 应用开发框架其状态机模块solon-state-machine基于事件驱动和状态模式设计。它的核心工作流程如下1.定义状态和事件通过枚举或类定义状态和事件。2.配置状态机使用StateMachineBuilder构建状态机包括状态、事件、动作和条件。3.启动和触发通过StateMachine实例启动状态机并发送事件触发状态转换。4.执行动作在状态转换过程中自动调用绑定的动作方法。Solon 状态机支持以下特性-同步和异步执行动作可以同步或异步执行。-条件判断通过条件Guard控制转换是否允许。-生命周期钩子在状态进入、退出和转换时触发自定义逻辑。## 快速上手一个简单的订单状态机让我们从零开始创建一个基于 Solon 状态机的订单状态管理示例。这个示例将模拟一个订单从创建到完成的完整生命周期。### 环境准备首先确保你的项目中引入了 Solon 状态机的依赖。在pom.xml中添加xmldependency groupIdorg.noear/groupId artifactIdsolon-state-machine/artifactId version2.5.0/version/dependency### 定义状态和事件java// 订单状态枚举public enum OrderState { CREATED, // 已创建 PAID, // 已支付 SHIPPED, // 已发货 COMPLETED, // 已完成 CANCELLED // 已取消}// 订单事件枚举public enum OrderEvent { PAY, // 支付 SHIP, // 发货 DELIVER, // 确认收货 CANCEL // 取消}### 编写可运行的状态机代码下面是一个完整的可运行代码示例演示如何配置和触发状态机javaimport org.noear.solon.stateMachine.*;import org.noear.solon.stateMachine.annotation.*;public class OrderStateMachineDemo { public static void main(String[] args) { // 1. 创建状态机构建器 StateMachineBuilderOrderState, OrderEvent builder new StateMachineBuilder(); // 2. 配置状态转换规则 // 初始状态CREATED builder.externalTransition() .from(OrderState.CREATED) .to(OrderState.PAID) .on(OrderEvent.PAY) .when(context - { // 条件支付金额必须大于0 Order order (Order) context.getContextObj(); return order.getAmount() 0; }) .perform(context - { // 动作记录支付日志 System.out.println(支付成功订单状态变更为PAID); }); builder.externalTransition() .from(OrderState.PAID) .to(OrderState.SHIPPED) .on(OrderEvent.SHIP) .perform(context - { System.out.println(已发货订单状态变更为SHIPPED); }); builder.externalTransition() .from(OrderState.SHIPPED) .to(OrderState.COMPLETED) .on(OrderEvent.DELIVER) .perform(context - { System.out.println(确认收货订单状态变更为COMPLETED); }); // 任何状态都可以取消 builder.externalTransition() .from(OrderState.CREATED) .to(OrderState.CANCELLED) .on(OrderEvent.CANCEL); builder.externalTransition() .from(OrderState.PAID) .to(OrderState.CANCELLED) .on(OrderEvent.CANCEL); // 3. 构建状态机实例 StateMachineOrderState, OrderEvent stateMachine builder.build(); // 4. 创建订单上下文对象 Order order new Order(); order.setAmount(100.0); // 5. 启动状态机并触发事件 StateMachineInstanceOrderState, OrderEvent instance stateMachine.start(OrderState.CREATED, order); System.out.println(当前状态: instance.getCurrentState()); // 尝试支付 instance.fire(OrderEvent.PAY); System.out.println(当前状态: instance.getCurrentState()); // 尝试发货 instance.fire(OrderEvent.SHIP); System.out.println(当前状态: instance.getCurrentState()); // 尝试确认收货 instance.fire(OrderEvent.DELIVER); System.out.println(当前状态: instance.getCurrentState()); }}// 订单实体类作为上下文对象class Order { private double amount; public double getAmount() { return amount; } public void setAmount(double amount) { this.amount amount; }}输出结果当前状态: CREATED支付成功订单状态变更为PAID当前状态: PAID已发货订单状态变更为SHIPPED当前状态: SHIPPED确认收货订单状态变更为COMPLETED当前状态: COMPLETED### 进阶示例带生命周期钩子的状态机Solon 状态机支持在状态进入、退出时触发回调这非常适合处理资源清理或日志记录。以下代码展示了如何使用生命周期钩子javaimport org.noear.solon.stateMachine.*;public class AdvancedStateMachineDemo { public static void main(String[] args) { StateMachineBuilderString, String builder new StateMachineBuilder(); // 配置状态转换并添加进入和退出回调 builder.externalTransition() .from(UNPAID) .to(PAID) .on(PAY) .when(context - true) // 无条件 .perform(context - { System.out.println(执行支付动作...); }); // 添加状态进入回调 builder.onEntry(PAID, context - { System.out.println(进入 PAID 状态发送支付成功通知); }); // 添加状态退出回调 builder.onExit(UNPAID, context - { System.out.println(退出 UNPAID 状态清理未支付订单缓存); }); // 构建状态机 StateMachineString, String stateMachine builder.build(); // 创建实例并触发 StateMachineInstanceString, String instance stateMachine.start(UNPAID, null); System.out.println(当前状态: instance.getCurrentState()); instance.fire(PAY); System.out.println(当前状态: instance.getCurrentState()); }}输出结果当前状态: UNPAID退出 UNPAID 状态清理未支付订单缓存执行支付动作...进入 PAID 状态发送支付成功通知当前状态: PAID## 深入原理状态机的内部机制Solon 状态机的核心实现基于以下组件1.StateMachineBuilder负责构建状态机配置包括状态、事件、转换规则、条件和动作。2.StateMachine状态机接口提供start()方法初始化实例。3.StateMachineInstance状态机实例管理当前状态和上下文对象提供fire()方法触发事件。4.Transition转换规则包含源状态、目标状态、事件、条件和动作。当调用fire()时状态机实例会1. 遍历当前状态下的所有转换规则。2. 匹配触发的事件。3. 检查条件Guard是否满足。4. 如果满足执行动作并更新当前状态。5. 触发生命周期钩子如onEntry、onExit。这种设计使得状态机逻辑清晰、易于扩展且避免了大量的 if-else 嵌套。## 总结通过本文我们深入剖析了 Solon 状态机的原理并通过两个可运行的代码示例展示了其核心功能。Solon 状态机不仅简化了状态转换的管理还提供了条件判断、生命周期钩子等高级特性使得代码更加模块化和可维护。在实际项目中状态机可以应用于订单流程、用户权限管理、游戏角色状态等场景。记住状态机的核心价值在于将复杂的业务逻辑抽象为清晰的状态转换图从而提升代码的可读性和可靠性。几分钟的学习就能让你在项目中轻松驾驭状态机

相关新闻

衰老诱发各类慢性疾病机制探究:细胞代谢调控与饮食干预延缓衰老研究综述_ MedChemExpress (MCE)

衰老诱发各类慢性疾病机制探究:细胞代谢调控与饮食干预延缓衰老研究综述_ MedChemExpress (MCE)

衰老,不仅是皮肤老化,更是癌症、糖尿病、心血管疾病及阿尔茨海默病等慢性疾病的风险因素...... Section.01 衰老 & 代谢 衰老机制高度依赖代谢调控,其中营养感应失调 (即细胞感知营养能力下降) 与线粒体功能障碍被公认为核心衰老标志物…

2026/7/29 9:02:08 阅读更多 →
如何通过Python脚本实现百度网盘高速下载:技术原理与实践指南

如何通过Python脚本实现百度网盘高速下载:技术原理与实践指南

如何通过Python脚本实现百度网盘高速下载:技术原理与实践指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 引言:传统下载的瓶颈与解决方案 百度网盘…

2026/7/29 9:02:08 阅读更多 →
终极HS2-HF Patch指南:Honey Select 2汉化去码补丁一键安装与优化配置

终极HS2-HF Patch指南:Honey Select 2汉化去码补丁一键安装与优化配置

终极HS2-HF Patch指南:Honey Select 2汉化去码补丁一键安装与优化配置 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch是专为Honey Sel…

2026/7/29 9:02:08 阅读更多 →

最新新闻

C++内存调试:0xdddddddd地址崩溃的原理、排查与防御编程

C++内存调试:0xdddddddd地址崩溃的原理、排查与防御编程

1. 项目概述:当程序撞上“死亡地址”在C开发中,最让人头疼的崩溃问题之一,莫过于访问一个无效的内存地址。如果崩溃报告里赫然写着0xdddddddd这个地址,那恭喜你,这通常不是一个随机的野指针,而是一个极具“…

2026/7/29 9:10:11 阅读更多 →
SpringBoot民航乘机管理系统设计与实现

SpringBoot民航乘机管理系统设计与实现

1. 项目概述:SpringBoot民航乘机管理系统 民航乘机管理系统是航空运输行业的核心业务支撑平台,负责处理从机票预订、值机选座到登机口调度的全流程业务。传统系统多采用单体架构或老旧技术栈,存在扩展性差、维护成本高等痛点。这个基于Spring…

2026/7/29 9:10:11 阅读更多 →
汽车IMMO防盗系统与PEPS无钥匙进入:原理、芯片与故障诊断

汽车IMMO防盗系统与PEPS无钥匙进入:原理、芯片与故障诊断

1. 项目概述:从一把钥匙到无感交互的进化还记得以前开车,总得在包里或口袋里摸索半天,找到那把带着锯齿的金属钥匙,对准锁孔,拧一下,才能打开车门。上车后,还得再把它插进方向盘旁边的钥匙孔&am…

2026/7/29 9:10:11 阅读更多 →
基于ESP32的智能助动车爆改:从硬件集成到嵌入式开发的完整实践

基于ESP32的智能助动车爆改:从硬件集成到嵌入式开发的完整实践

1. 项目概述:从“代步工具”到“移动创意平台”的蜕变 “爆改助动车”这个项目,听起来就带着一股浓浓的极客味儿和动手的冲动。它绝不仅仅是给一辆普通的电动自行车换个颜色、加个灯那么简单。在我十多年的硬件折腾和创客项目经验里,这类“爆…

2026/7/29 9:10:11 阅读更多 →
CAN总线多帧发送协议详解:从单帧到大数据传输的实战指南

CAN总线多帧发送协议详解:从单帧到大数据传输的实战指南

1. 项目概述:为什么我们需要关注CAN总线的多帧发送?在嵌入式开发和汽车电子领域,CAN总线是连接各个ECU(电子控制单元)的“神经系统”。我们平时调试,发个几字节的数据,单帧发送就搞定了&#xf…

2026/7/29 9:10:11 阅读更多 →
质感居家装修:奶油风瓷砖/金丝绒柔光砖怎么选?

质感居家装修:奶油风瓷砖/金丝绒柔光砖怎么选?

在家装设计行业中,奶油风凭借柔和的空间氛围,成为大众喜爱的装修风格。金丝绒柔光砖是适配该风格的主流墙面、地面建材,依托特殊的釉面工艺,形成了独特的视觉与触感表现。1. 顺辉瓷砖岩板顺辉瓷砖岩板布局有金丝绒柔光砖品类&…

2026/7/29 9:09:11 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻