分钟带你体验 Solon 的状态机

发布时间:2026/7/29 9:02:08
分钟带你体验 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 状态机不仅简化了状态转换的管理还提供了条件判断、生命周期钩子等高级特性使得代码更加模块化和可维护。在实际项目中状态机可以应用于订单流程、用户权限管理、游戏角色状态等场景。记住状态机的核心价值在于将复杂的业务逻辑抽象为清晰的状态转换图从而提升代码的可读性和可靠性。几分钟的学习就能让你在项目中轻松驾驭状态机