Home  >  Article  >  Java  >  How to implement Java state machine

How to implement Java state machine

WBOY
WBOYforward
2023-05-14 11:40:062575browse

Suppose we have two states

How to implement Java state machine

This state transition is very simple, let’s try to implement it in java

The program structure is as shown below

How to implement Java state machine

Let’s first introduce the representation of status

public class StateTransaction {
 
    // 当前状态
    private StateEnum currentState;
    // 相对应动作
    private ActionEnum action;
    // 下一个状态
    private StateEnum nextState;
    // 相应事件
    private Event event;
 
    public StateTransaction() {
 
    }
 
    public StateEnum getCurrentState() {
        return currentState;
    }
 
    public ActionEnum getAction() {
        return action;
    }
 
    public StateEnum getNextState() {
        return nextState;
    }
 
    public Event getEvent() {
        return event;
    }
 
    // 链式初始化对象
    public StateTransaction source(StateEnum state) {
        currentState = state;
        return this;
    }
    public StateTransaction when(ActionEnum action) {
        this.action = action;
        return this;
    }
    public StateTransaction target(StateEnum state) {
        nextState = state;
        return this;
    }
    public StateTransaction how(Event event) {
        this.event = event;
        return this;
    }
 
}

As you can see, there are four quantities representing status, which are:

  • currentState: indicates the current state

  • action: indicates the corresponding action

  • nextState: indicates the next state

  • event: Indicates the corresponding event

The meaning of this four-tuple is that when in the currentState state, if an action occurs, it will be transferred to nextState status, and will trigger a response to the event event.

Pay attention to the four methods of chain initialization. The definition of these four methods makes the initialization of state very elegant.

Let’s take a look at events. Event is an interface. Other specific events implement this interface to perform certain operations. Our program will print some information directly without doing complicated operations

public interface Event {
 
    public String handle();
 
}
public class PlayBasketballEvent implements Event{
    @Override
    public String handle() {
        System.out.println("开始打篮球");
        return "开始打篮球";
    }
}
public class SingDanceRapEvent implements Event{
    @Override
    public String handle() {
        System.out.println("开始唱,跳,rap");
        return "开始唱,跳,rap";
    }
}

In addition, we also need to define two enumeration classes to represent states and actions respectively

public enum StateEnum {
    // 打篮球
    PLAY_BASKETBALL,
    // 唱跳rap
    SING_DANCE_RAP
}
public enum ActionEnum {
    // 音乐起
    MUSIC_ON,
    // 音乐结束
    MUSIC_OFF
}

After the above preparations are completed, we need a state machine class to perform state transfer

public class StateMachine {
 
    // 存储状态信息
    private List<StateTransaction> stateTransactionList;
    // 记录当前状态
    private StateEnum currentState;
 
    public StateMachine(StateEnum state) {
        currentState = state;
        stateTransactionList = new ArrayList<>();
    }
 
    // 添加一条状态信息
    public StateTransaction addone() {
        StateTransaction stateTransaction = new StateTransaction();
        stateTransactionList.add(stateTransaction);
        return stateTransaction;
    }
 
    // 进行状态转移
    public StateTransaction execute(ActionEnum action) {
        for(int i=0; i<stateTransactionList.size(); i++) {
            if(currentState==stateTransactionList.get(i).getCurrentState() &&
                action==stateTransactionList.get(i).getAction()) {
                stateTransactionList.get(i).getEvent().handle();
                currentState = stateTransactionList.get(i).getNextState();
                return stateTransactionList.get(i);
            }
        }
        return null;
    }
 
}

There are two key methods in the above code, namely addone() and execute()

Let’s talk about addone() first. The method first initializes a StateTransaction object, then puts it in the List, and finally adds this The object is returned. Once we get this object, we can fill in the content.

Let’s talk about execute(). This method receives ActionEnum as a parameter, and then traverses the list to look for such a piece of status information of the next object obtained by changing the current status through the corresponding action. If found, execute the event. The handle() method, and transfer the current state, and finally return StateTransaction, if not found, return null.

Finally let’s look at the initialization method

public class StateMachineTest {
 
    public static void main(String[] args) {
        StateMachine machine = new StateMachine(StateEnum.PLAY_BASKETBALL);
        // 打篮球的时候,一旦音乐起,就会开始唱跳rap
        machine.addone().source(StateEnum.PLAY_BASKETBALL).when(ActionEnum.MUSIC_ON)
                .target(StateEnum.SING_DANCE_RAP).how(new SingDanceRapEvent());
        // 唱跳rap的时候,一旦音乐停止,就会开始打篮球
        machine.addone().source(StateEnum.SING_DANCE_RAP).when(ActionEnum.MUSIC_OFF)
                .target(StateEnum.PLAY_BASKETBALL).how(new PlayBasketballEvent());
        machine.execute(ActionEnum.MUSIC_ON);
        machine.execute(ActionEnum.MUSIC_OFF);
    }
 
}

As you can see, we can create a state transfer message directly using the chain method, which is very elegant

The program output is as follows

How to implement Java state machine

The above is the detailed content of How to implement Java state machine. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:yisu.com. If there is any infringement, please contact admin@php.cn delete