springboot~stateless4j实现状态机

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

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<State, Trigger> 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<State, Trigger> 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() 方法触发状态转换。最后,我们获取当前状态并输出。