第一个是 State ,状态。一个状态机至少要包含两个状态。例如上面自动门的例子,有 open 和 closed 两个状态。
第二个是 Event ,事件。事件就是执行某个操作的触发条件或者口令。对于自动门,“按下开门按钮”就是一个事件。
第三个是 Action ,动作。事件发生以后要执行动作。例如事件是“按开门按钮”,动作是“开门”。编程的时候,一个 Action一般就对应一个函数。
第四个是 Transition ,变换。也就是从一个状态变化为另一个状态。例如“开门过程”就是一个变换。
六种元素:起始、终止、现态、次态(目标状态)、动作、条件
以订单为例:以从待支付状态转换为待发货状态为例
WAIT_PAYMENT(1, “待支付”),
WAIT_DELIVER(2, “待发货”),
WAIT_RECEIVE(3, “待收货”),
FINISH(4, “已完成”);
PAYED, 支付
DELIVERY, 发货
RECEIVED; 确认收货
待支付-》待发货 PAYED
待发货-》待收货 DELIVERY
待收货-》已完成 RECEIVED
/**
- 配置状态
- @param states
- @throws Exception
*/
public void configure(StateMachineStateConfigurer<OrderStatus, OrderStatusChangeEvent> states) throws Exception {
states.withStates()
.initial(OrderStatus.WAIT_PAYMENT) 初始状态
.states(EnumSet.allOf(OrderStatus.class));
}
/**
- 配置状态转换事件关系
- @param transitions
- @throws Exception
*/
public void configure(StateMachineTransitionConfigurer<OrderStatus, OrderStatusChangeEvent> transitions) throws Exception {
transitions
//支付事件:待支付-》待发货
.withExternal().source(OrderStatus.WAIT_PAYMENT).target(OrderStatus.WAIT_DELIVER).event(OrderStatusChangeEvent.PAYED)
.and()
//发货事件:待发货-》待收货
.withExternal().source(OrderStatus.WAIT_DELIVER).target(OrderStatus.WAIT_RECEIVE).event(OrderStatusChangeEvent.DELIVERY)
.and()
//收货事件:待收货-》已完成
.withExternal().source(OrderStatus.WAIT_RECEIVE).target(OrderStatus.FINISH).event(OrderStatusChangeEvent.RECEIVED);
}
状态机:https://www.cnblogs.com/javastack/p/17432557.html
状态机介绍1:https://www.codetd.com/article/1010726
状态机介绍2:https://blog.youkuaiyun.com/u012129558/article/details/90519577