Java如何通過(guò)枚舉實(shí)現(xiàn)有限狀態(tài)機(jī)
首先在枚舉類(lèi)中 定義state 和定義的抽象方法。
public enum JavaPlatformState { // 定義state OPEN{ @Override void exit(JavaPlatformMachine pm){super.exit(pm);} @Override void valid(JavaPlatformMachine pm){ this.exit(pm); if(pm.data.getValid_()){ pm.state =STEP1; }else{ NotFound(); pm.state =OFF; } pm.state.entry(pm); } @Override void first(JavaPlatformMachine pm) {} @Override void businessLine(JavaPlatformMachine pm) {} @Override void district(JavaPlatformMachine pm) {} }, STEP1{ @Override void exit(JavaPlatformMachine pm){super.exit(pm);} @Override void valid(JavaPlatformMachine pm) {} @Override void first(JavaPlatformMachine pm){ this.exit(pm); if(!pm.data.getFirst_()){ pm.state =STEP2; }else{ ReturnDimension(); pm.state =OFF; } pm.state.entry(pm); } @Override void businessLine(JavaPlatformMachine pm) {} @Override void district(JavaPlatformMachine pm) {} }, ... //狀態(tài)模式 提取的接口 在常量實(shí)體類(lèi)中實(shí)現(xiàn)抽象方法 abstract void valid(JavaPlatformMachine pm); abstract void first(JavaPlatformMachine pm); abstract void businessLine(JavaPlatformMachine pm); abstract void district(JavaPlatformMachine pm); }
在enum JavaPlatformState 中,除了狀態(tài)模式 提取的接口外,添加了狀態(tài)機(jī)的各種動(dòng)作action實(shí)現(xiàn)
//狀態(tài)機(jī)的各種動(dòng)作action methode void entry(JavaPlatformMachine pm){System.out.println("→"+pm.state.name());} void exit(JavaPlatformMachine pm){System.out.println(pm.state.name()+"→ ");} void NotFound(){System.out.println("NotFound");} void ReturnDimension(){System.out.println("ReturnDimension");} void PreciseAdvertising(){System.out.println("PreciseAdvertising");} void Top9(){System.out.println("Top9");}
建立狀態(tài)機(jī)實(shí)體,ContextData是封裝條件的bean類(lèi),初始化狀態(tài)OPEN,在狀態(tài)機(jī)里定義action,調(diào)用對(duì)應(yīng)state的相應(yīng)的方法。
public class ContextData { private Boolean isValid_;//廣告位是否有效 private Boolean isFirst_;//是否第一次請(qǐng)求 private Boolean isBusinessLine_;//是否屬于業(yè)務(wù)線廣告位 private Boolean district_;//是否有地域 ... }
public class JavaPlatformMachine { ContextData data = new ContextData(); JavaPlatformState state = JavaPlatformState.OPEN; //Action public void valid(){state.valid(this);} public void first(){state.first(this);} public void businessLine(){state.businessLine(this);} public void district(){state.district(this);} }
測(cè)試方法,初始化狀態(tài)機(jī),設(shè)置參數(shù),按次序調(diào)用對(duì)應(yīng)的Action
JavaPlatformMachine pm = new JavaPlatformMachine(); pm.data.setValid_(true);// 廣告位是否有效 pm.data.setFirst_(false);// 是否第一次請(qǐng)求 pm.data.setBusinessLine_(true);//是否屬于業(yè)務(wù)線廣告位 pm.data.setDistrict_(true);//是否有地域 pm.valid(); pm.first(); pm.businessLine(); pm.district();
輸出結(jié)果:
OPEN→ →STEP1 STEP1→ →STEP2 STEP2→ →STEP3 STEP3→ Top9 →OFF
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java設(shè)計(jì)模式之單例模式的詳解及優(yōu)點(diǎn)
這篇文章主要介紹了java設(shè)計(jì)模式之單例模式的詳解及優(yōu)點(diǎn)的相關(guān)資料,如果一個(gè)類(lèi)始終只能創(chuàng)建一個(gè)實(shí)例,那么這個(gè)類(lèi)被稱(chēng)為單例類(lèi),這種設(shè)計(jì)模式被稱(chēng)為單例模式,需要的朋友可以參考下2017-08-08SpringBoot整合Apache Ignite的實(shí)現(xiàn)
本文主要介紹了SpringBoot整合Apache Ignite的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10SpringBoot之Refresh流程的簡(jiǎn)單說(shuō)明
這篇文章主要介紹了SpringBoot之Refresh流程的簡(jiǎn)單說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09springboot+maven多環(huán)境動(dòng)態(tài)配置及編譯失敗的解決方案(步驟詳解)
這篇文章主要介紹了springboot+maven多環(huán)境動(dòng)態(tài)配置及編譯失敗的解決方案,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11手把手帶你分析SpringBoot自動(dòng)裝配完成了Ribbon哪些核心操作
這篇文章主要介紹了詳解Spring Boot自動(dòng)裝配Ribbon哪些核心操作的哪些操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08Java實(shí)現(xiàn)快速將HTML表格轉(zhuǎn)換成Excel
這篇文章主要為大家詳細(xì)介紹一種使用Java的快速將Web中表格轉(zhuǎn)換成Excel的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05