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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。