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


猜你喜欢
- 有时候会不可避免使用动态表或者列进行业务处理。下面学习几种动态表/列的使用方式:【1】使用预编译即,默认值。<select id=&q
- 问题换了台开发机,重新安装了下开发环境。突然发现Visual Studio Code无法用来调试Unity了。明明流程都是按照Unity官方
- 我本地的springboot版本是2.5.1,后面的分析都是基于这个版本 <parent> &nbs
- 实现Callable的对象中,用@Autowired注入别的对象失败场景是这样:我需要在一个实现类A中写一个拿到返回值的多线程,于是用的Ca
- 什么是冒泡排序冒泡排序指重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从小到大)错误就把他们交换过来。走访元素的工作是重复
- 本文实例为大家分享了C#实现猜数字小游戏的具体代码,供大家参考,具体内容如下效果如图:代码:using System;using Syste
- 本文实例讲述了C#对二进制数据进行base64编码的方法。分享给大家供大家参考。具体实现方法如下:using System;using Sy
- Java核心代码:public String getSmsInPhone() { final String SMS_URI_ALL = &q
- 使用线程池的好处1、降低资源消耗可以重复利用已创建的线程降低线程创建和销毁造成的消耗。2、提高响应速度当任务到达时,任务可以不需要等到线程创
- 问题现象今天在做一个需求:将存入数据库中的数据读到后解析成list遍历分析数据格式:"[1677660600000, 167766
- 作为Android app,发布多个分发平台是常规操作。然后,有时由于个渠道面对的用户不同,或平台审核标准不同,需要在各渠道使用不同的业务逻
- 首先,想要明白hashCode的作用,你必须要先知道Java中的集合。 总的来说,Java中的集合(Collection)有两类,一类是Li
- 谨记:Url表只储存受保护的资源,不在表里的资源说明不受保护,任何人都可以访问1、MyFilterInvocationSecurityMet
- Java 判断字符串是否为IP地址,供大家参考,具体内容如下1、代码主要就是这么几个条件非空长度符合 0.0.0.0 - 255.255.2
- 本文实例讲述了java实现列表、集合与数组之间转化的方法。分享给大家供大家参考。具体实现方法如下:package test; i
- 1. xml文件中加入自定义 搜索view<com.etoury.etoury.ui.view.IconCenterEditText
- 对于生成的sql语句 自动加上单引号的情况mybatis是这样的,如果表的字段跟系统字段冲突,写sql语句的时候必须得加上单引号,这样才会区
- 目录一对一关联保存:留言表实体类配置:(主表)留言内容表配置:(从表)留言表hbm.xml配置:(主表)留言内容表hbm.xml配置:(从表
- 本篇内容通过操作软键盘的函数着手详细分析了隐藏或者显示软键盘的实现方法,并且对其中重要的代码做了详细分析。一、开篇如果有需要用到输入的地方,
- 1,Java中操作方法:import java.io.*; public class FileInputStreamTest &