Solon v3.7.1

应用示例:订单状态机

</> markdown

本例以订单场景作为参考

1、定义状态相关类

  • 订单事件枚举
public enum OrderEvent {
    CREATE, PAY, SHIP, DELIVER, CANCEL;
}
  • 订单状态枚举
public enum OrderState {
    NONE,CREATED, PAID, SHIPPED, DELIVERED, CANCELLED;
}
  • 订单 (直接实现事件上下文,仅供参考)
import org.noear.solon.statemachine.EventContext;

public class Order implements EventContext<OrderState, Order>{
  ...
}

2、定义状态机 OrderStateMachine


import org.noear.solon.annotation.Component;
import org.noear.solon.statemachine.StateMachine;

/**
 * 订单状态机
 */
public class OrderStateMachine extends StateMachine<OrderState, OrderEvent, Order> {
    public OrderStateMachine() {
        // 无 -> 创建订单
        from(OrderState.NONE).on(OrderEvent.CREATE).to(OrderState.CREATED).then(ctx -> {
            Order payload = ctx.getPayload();
            payload.setState(OrderState.CREATED);
            System.out.println(payload);
        });

        // 创建 -> 支付
        from(OrderState.CREATED).on(OrderEvent.PAY).to(OrderState.PAID).then(ctx -> {
                    Order payload = ctx.getPayload();
                    payload.setState(OrderState.PAID);
                    System.out.println(payload);
                }
        );

        // 支付 -> 发货
        from(OrderState.PAID).on(OrderEvent.SHIP).to(OrderState.SHIPPED).then(ctx -> {
                    Order payload = ctx.getPayload();
                    payload.setState(OrderState.SHIPPED);
                    System.out.println(payload);
                }
        );


        // 发货 -> 送达
        from(OrderState.SHIPPED).on(OrderEvent.DELIVER).to(OrderState.DELIVERED).then(ctx -> {
                    Order payload = ctx.getPayload();
                    payload.setState(OrderState.DELIVERED);
                    System.out.println(payload);
                }
        );
    }
}

3、应用测试

public class StatemachineTest {
    @Test
    public void test() {
        OrderStateMachine stateMachine = new OrderStateMachine();

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

        stateMachine.sendEvent(OrderEvent.CREATE, order); //使用定制事件上下文
        stateMachine.sendEvent(OrderEvent.PAY, order);
        stateMachine.sendEvent(OrderEvent.SHIP, EventContext.of(order.getState(),  order)); //使用内置上下文
        stateMachine.sendEvent(OrderEvent.DELIVER, EventContext.of(order.getState(),  order));
    }
}