>  기사  >  Java  >  Java 상태 머신을 구현하는 방법

Java 상태 머신을 구현하는 방법

WBOY
WBOY앞으로
2023-05-14 11:40:062575검색

두 가지 상태가 있다고 가정합시다

Java 상태 머신을 구현하는 방법

이 상태 전환은 매우 간단합니다. Java로 구현해 보겠습니다

프로그램 구조는 아래와 같습니다

Java 상태 머신을 구현하는 방법

먼저 상태 표현을 소개하겠습니다

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;
    }
 
}

상태를 나타내는 네 가지 수량이 있습니다. 즉:

  • currentState: 현재 상태를 나타냅니다.

  • action: 해당 작업을 나타냅니다.

  • nextState: 다음 상태를 나타냅니다.

  • event: 해당 이벤트를 나타냅니다

이 4-튜플의 의미는 currentState 상태에서 작업이 발생하면 nextState 상태로 전환되고 이벤트 이벤트 응답이 트리거된다는 것입니다.

네 가지 체인 초기화 방법에 주의하세요. 이 네 가지 방법의 정의는 상태 초기화를 매우 우아하게 만듭니다.

이벤트를 살펴보겠습니다. 다른 특정 이벤트는 특정 작업을 수행하기 위해 이 인터페이스를 구현합니다. 우리 프로그램은 복잡한 작업을 수행하지 않고 일부 정보를 직접 인쇄합니다

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";
    }
}

또한 두 개의 열거형 클래스를 정의해야 합니다.

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

위의 준비가 완료되면 상태 전송을 수행하기 위한 상태 머신 클래스가 필요합니다

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;
    }
 
}

위 코드에는 addone( )과execute()라는 두 가지 주요 메소드가 있습니다

Let's 먼저 addone()에 대해 이야기합니다. 이 메서드는 먼저 StateTransaction 객체를 초기화한 다음 이를 List에 넣고 마지막으로 객체를 반환하면 내용을 채울 수 있습니다.

다시 Execution()에 대해 이야기해 보겠습니다. 이 메서드는 ActionEnum을 매개변수로 받은 후 목록을 순회하여 해당 작업을 통해 현재 상태를 변경하여 얻은 다음 개체의 상태 정보를 찾습니다. 이벤트 메서드의 handler()를 호출하고 현재 상태를 전송하고 마지막으로 StateTransaction을 반환하거나 찾을 수 없으면 null을 반환합니다.

마지막으로 초기화 방법을 살펴보겠습니다

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);
    }
 
}

체인 방법을 사용하여 직접 상태 이전 메시지를 생성할 수 있다는 것을 알 수 있는데 매우 우아합니다

프로그램 출력은 다음과 같습니다

Java 상태 머신을 구현하는 방법

위 내용은 Java 상태 머신을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제