应用示例:订单状态机
本例以订单场景作为参考
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));
}
}