Java如何通过枚举实现有限状态机
作者:BarryW 时间:2021-08-05 04:21:05
首先在枚举类中 定义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
标签:Java,枚举,有限,状态机
0
投稿
猜你喜欢
springcloud引入spring-cloud-starter-openfeign失败的解决
2022-10-30 19:15:09
springboot+springmvc实现登录拦截
2023-04-26 19:23:26
SpringCloud Eureka搭建的方法步骤
2021-10-10 11:03:29
简单了解java自定义和自然排序
2022-01-29 02:47:26
Hutool开发利器MapProxy类使用技巧详解
2021-11-10 00:01:35
C#特性-对象集合初始化器介绍
2023-05-27 18:26:29
mybatis和mybatis-plus同时使用的坑
2021-07-22 14:03:13
SpringBoot异常处理器的使用与添加员工功能实现流程介绍
2021-10-21 19:24:23
Java实现的Base64加密算法示例
2023-10-29 00:37:08
c# WPF中CheckBox样式的使用总结
2023-07-17 15:44:46
Java异步处理机制实例详解
2022-05-12 01:39:37
C#微信公众号开发之用户管理
2023-04-13 02:40:12
Android ScrollView滑动实现仿QQ空间标题栏渐变
2021-06-13 16:32:19
利用Android实现光影流动特效的方法详解
2023-09-03 01:22:31
深入解析java中的静态代理与动态代理
2023-08-23 13:10:56
详解如何实现SpringBoot的底层注解
2023-11-23 06:21:04
C语言实现二叉树的基本操作
2023-02-28 12:31:52
Java集合框架Collections原理及用法实例
2021-12-04 18:10:20
mybatis QueryWrapper的条件构造之apply、last、select解析
2022-02-12 17:32:51
C#条件语句、循环语句(if、while)
2023-09-27 19:49:23