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:表示對應事件
這個四元組的意思是,當處於currentState狀態的時候,如果發生了action動作,就會轉移到nextState狀態,並且會觸發event事件的回應。
注意看鍊式初始化的四個方法,這四個方法的定義讓狀態的初始化變得很優雅。
接著來看一下事件,Event是一個接口,其他具體的事件實現該接口進行某些操作,我們這個程式就直接打印一些信息,不做複雜的操作
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()
先來說addone(),方法先初始化一個StateTransaction對象,然後放到List裡面,最後將這個物件返回,我們拿到這個物件就可以往裡面填內容了。
再說說execute(),這個方法接收ActionEnum作為參數,然後會遍歷列表,尋找一條當前狀態經過相應動作變化得到的下一個對象的這麼一個狀態信息,如果找到了就執行event中的handle()方法,並且將目前狀態進行轉移,最後將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狀態機怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。
