(相关资料图)
状态机,包括了状态和动作,某个状态下,只能执行某些动作,如果动作不匹配,状态是不会进行变更了,这样就保护了我们状态字段的准备性,不能随意改变,必须按着我们设计的规则进行状态的轮转。
Stateless实现的状态机
- 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()
方法触发状态转换。最后,我们获取当前状态并输出。