Java如何通過列舉實現有限狀態機
阿新 • • 發佈:2020-07-07
首先在列舉類中 定義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) {} },... //狀態模式 提取的介面 在常量實體類中實現抽象方法 abstract void valid(JavaPlatformMachine pm); abstract void first(JavaPlatformMachine pm); abstract void businessLine(JavaPlatformMachine pm); abstract void district(JavaPlatformMachine pm); }
在enum JavaPlatformState 中,除了狀態模式 提取的介面外,添加了狀態機的各種動作action實現
//狀態機的各種動作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");}
建立狀態機實體,ContextData是封裝條件的bean類,初始化狀態OPEN,在狀態機裡定義action,呼叫對應state的相應的方法。
public class ContextData { private Boolean isValid_;//廣告位是否有效 private Boolean isFirst_;//是否第一次請求 private Boolean isBusinessLine_;//是否屬於業務線廣告位 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);} }
測試方法,初始化狀態機,設定引數,按次序呼叫對應的Action
JavaPlatformMachine pm = new JavaPlatformMachine(); pm.data.setValid_(true);// 廣告位是否有效 pm.data.setFirst_(false);// 是否第一次請求 pm.data.setBusinessLine_(true);//是否屬於業務線廣告位 pm.data.setDistrict_(true);//是否有地域 pm.valid(); pm.first(); pm.businessLine(); pm.district();
輸出結果:
OPEN→ →STEP1 STEP1→ →STEP2 STEP2→ →STEP3 STEP3→ Top9 →OFF
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。