环球通讯!springboot~stateless4j实现状态机

博客园   2023-06-25 18:50:30


(相关资料图)

状态机,包括了状态和动作,某个状态下,只能执行某些动作,如果动作不匹配,状态是不会进行变更了,这样就保护了我们状态字段的准备性,不能随意改变,必须按着我们设计的规则进行状态的轮转。

Stateless实现的状态机

  1. Stateless:Stateless 是一个简单且易于使用的状态机库,它提供了基本的状态转换和动作执行功能。以下是一个使用 Stateless 实现的简单状态机示例:
import com.github.oxo42.stateless4j.StateMachine;import com.github.oxo42.stateless4j.StateMachineConfig;import com.github.oxo42.stateless4j.transitions.Transition;public class StateMachineExample {enum State {/** * 表示电话机已经从底座拿起,但用户还没有拨打或者接听电话,此时电话处于空闲状态 */OFF_HOOK,/** * 响铃 */RINGING,/** * 连接 */CONNECTED,/** * 表示通话的一方需要暂时挂起通话 */ON_HOLD}enum Trigger {/** * 用户拨打电话并等待接听 */CALL_DIALED,/** * 表示通话结束后挂断电话 */HUNG_UP,/** * 表示接听方接通电话,此时双方正常通话。 */CALL_CONNECTED,/** * 表示通话的一方需要暂时挂起通话 */PLACED_ON_HOLD,/** * 表示恢复保持状态执行通话【与PLACED_ON_HOLD对应】 */TAKEN_OFF_HOLD,/** * 留言 */LEFT_MESSAGE,/** * 表示通话的一方结束通话并停止使用电话 */STOP_USING_PHONE}    public static void main(String[] args) {        // 创建状态机配置        StateMachineConfig config = new StateMachineConfig<>();        // 定义状态转换规则        config.configure(State.OFF_HOOK)                .permit(Trigger.CALL_DIALED, State.RINGING);        config.configure(State.RINGING)                .permit(Trigger.HUNG_UP, State.OFF_HOOK)                .permit(Trigger.CALL_CONNECTED, State.CONNECTED);        config.configure(State.CONNECTED)                .permit(Trigger.LEFT_MESSAGE, State.OFF_HOOK)                .permit(Trigger.HUNG_UP, State.OFF_HOOK)                .permit(Trigger.PLACED_ON_HOLD, State.ON_HOLD);        config.configure(State.ON_HOLD)                .permit(Trigger.TAKEN_OFF_HOLD, State.CONNECTED)                .permit(Trigger.HUNG_UP, State.OFF_HOOK);        // 创建状态机实例        StateMachine stateMachine = new StateMachine<>(State.OFF_HOOK, config);        // 执行状态转换        stateMachine.fire(Trigger.CALL_DIALED);        stateMachine.fire(Trigger.CALL_CONNECTED);        stateMachine.fire(Trigger.PLACED_ON_HOLD);        stateMachine.fire(Trigger.TAKEN_OFF_HOLD);        stateMachine.fire(Trigger.HUNG_UP);        // 获取当前状态        State currentState = stateMachine.getState();        System.out.println("Current State: " + currentState);    }}

在上面的示例中,我们使用 StateMachine类创建了一个状态机,并定义了状态(State)和触发器(Trigger)。通过配置状态转换规则,我们可以使用 fire()方法触发状态转换。最后,我们获取当前状态并输出。

企业

经济