Solon v3.4.2

solon-statemachine [预览]

</> markdown

此插件,由社区成员(王奇奇)贡献

<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-statemachine</artifactId>
</dependency>

1、描述

基础扩展插件,提供为 Solon 状态机的能力。v3.4.3 后支持

2、主要接口

接口说明
Event事件接口
State状态接口
StateContext状态上下文
StateMachine状态机
StateTransition状态转换器

3、应用示例

准备

/**
 * 订单事件枚举
 */
public enum OrderEvent implements Event {
    CREATE, PAY, SHIP, DELIVER, CANCEL;
}

/**
 * 订单状态枚举
 */
public enum OrderState implements State {
    NONE,CREATED, PAID, SHIPPED, DELIVERED, CANCELLED;
}

/**
 * 订单
 */
public class Order {
}

测试

public class StatemachineTest {
    @Test
    public void test() {
        // 创建状态机实例
        StateMachine<OrderState, OrderEvent, Order> stateMachine = new StateMachine<>(OrderState.NONE);

        // 无 -> 创建订单
        stateMachine.addTransition(new StateTransition<>(OrderState.NONE, OrderState.CREATED, OrderEvent.CREATE,
                (order) -> {
                    Order payload = order.getPayload();
                    payload.setStatus("已创建");
                    System.out.println(payload);
                }
        ));

        // 创建 -> 支付
        stateMachine.addTransition(new StateTransition<>(OrderState.CREATED, OrderState.PAID, OrderEvent.PAY,
                (order) -> {
                    Order payload = order.getPayload();
                    payload.setStatus("已支付");
                    System.out.println(payload);
                }
        ));

        // 支付 -> 发货
        stateMachine.addTransition(new StateTransition<>(OrderState.PAID, OrderState.SHIPPED, OrderEvent.SHIP,
                (order) -> {
                    Order payload = order.getPayload();
                    payload.setStatus("已发货");
                    System.out.println(payload);
                }
        ));


        // 发货 -> 送达
        stateMachine.addTransition(new StateTransition<>(OrderState.SHIPPED, OrderState.DELIVERED, OrderEvent.DELIVER,
                (order) -> {
                    Order payload = order.getPayload();
                    payload.setStatus("已送达");
                    System.out.println(payload);
                }
        ));

        Order order = new Order("1", "iphone16 pro max", null);

        stateMachine.execute(OrderEvent.CREATE, order);
        stateMachine.execute(OrderEvent.PAY, order);
        stateMachine.execute(OrderEvent.SHIP, order);
        stateMachine.execute(OrderEvent.DELIVER, order);
    }
}