Java如何通过枚举实现有限状态机
首先在枚举类中定义state和定义的抽象方法。
publicenumJavaPlatformState{
//定义state
OPEN{
@Overridevoidexit(JavaPlatformMachinepm){super.exit(pm);}
@Overridevoidvalid(JavaPlatformMachinepm){
this.exit(pm);
if(pm.data.getValid_()){
pm.state=STEP1;
}else{
NotFound();
pm.state=OFF;
}
pm.state.entry(pm);
}
@Override
voidfirst(JavaPlatformMachinepm){}
@Override
voidbusinessLine(JavaPlatformMachinepm){}
@Override
voiddistrict(JavaPlatformMachinepm){}
},
STEP1{
@Overridevoidexit(JavaPlatformMachinepm){super.exit(pm);}
@Override
voidvalid(JavaPlatformMachinepm){}
@Overridevoidfirst(JavaPlatformMachinepm){
this.exit(pm);
if(!pm.data.getFirst_()){
pm.state=STEP2;
}else{
ReturnDimension();
pm.state=OFF;
}
pm.state.entry(pm);
}
@Override
voidbusinessLine(JavaPlatformMachinepm){}
@Override
voiddistrict(JavaPlatformMachinepm){}
},
...
//状态模式提取的接口在常量实体类中实现抽象方法
abstractvoidvalid(JavaPlatformMachinepm);
abstractvoidfirst(JavaPlatformMachinepm);
abstractvoidbusinessLine(JavaPlatformMachinepm);
abstractvoiddistrict(JavaPlatformMachinepm);
}
在enumJavaPlatformState中,除了状态模式提取的接口外,添加了状态机的各种动作action实现
//状态机的各种动作actionmethode
voidentry(JavaPlatformMachinepm){System.out.println("→"+pm.state.name());}
voidexit(JavaPlatformMachinepm){System.out.println(pm.state.name()+"→");}
voidNotFound(){System.out.println("NotFound");}
voidReturnDimension(){System.out.println("ReturnDimension");}
voidPreciseAdvertising(){System.out.println("PreciseAdvertising");}
voidTop9(){System.out.println("Top9");}
建立状态机实体,ContextData是封装条件的bean类,初始化状态OPEN,在状态机里定义action,调用对应state的相应的方法。
publicclassContextData{
privateBooleanisValid_;//广告位是否有效
privateBooleanisFirst_;//是否第一次请求
privateBooleanisBusinessLine_;//是否属于业务线广告位
privateBooleandistrict_;//是否有地域
...
}
publicclassJavaPlatformMachine{
ContextDatadata=newContextData();
JavaPlatformStatestate=JavaPlatformState.OPEN;
//Action
publicvoidvalid(){state.valid(this);}
publicvoidfirst(){state.first(this);}
publicvoidbusinessLine(){state.businessLine(this);}
publicvoiddistrict(){state.district(this);}
}
测试方法,初始化状态机,设置参数,按次序调用对应的Action
JavaPlatformMachinepm=newJavaPlatformMachine(); 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。