Java枚舉實現有限狀態機

首先在枚舉類中 定義state 和定義的抽象方法。ide

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的相應的方法。this

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

測試方法,初始化狀態機,設置參數,按次序調用對應的Actionspa

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

輸出結果:code

OPEN→ 
→STEP1
STEP1→ 
→STEP2
STEP2→ 
→STEP3
STEP3→ 
Top9
→OFF
相關文章
相關標籤/搜索