软件编程
位置:首页>> 软件编程>> java编程>> Java如何通过枚举实现有限状态机

Java如何通过枚举实现有限状态机

作者:BarryW  发布时间:2021-08-05 04:21:05 

标签: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

来源:https://www.cnblogs.com/barrywxx/p/12861162.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com