1. 程式人生 > 程式設計 >Java如何通過列舉實現有限狀態機

Java如何通過列舉實現有限狀態機

首先在列舉類中 定義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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。