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
  • asp之家 软件编程 m.aspxhome.com