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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java中枚举原来还可以这么用

    前言 相信不少java开发者写过状态变更的业务,比如订单流程.请假流程等等.一般会搞一个状态标识来标识生命周期的某个阶段.很多人会写这种逻辑: 如果流程几十个岂不是要if到爆炸.还有这"0"."1"是几个意思? 优化的办法当然可以使用设计模式中的状态模式来搞,允许一个具有状态的对象根据其状态封装同一对象的不同行为.我们可以编程状态之间的转换,然后定义单独的状态: 但是这种操作会增加过多的状态对象依赖.那么有没骚操作呢?当然有.我们先来了解了解状态机. 状态机 状态机

  • 优雅地在Java应用中实现全局枚举处理的方法

    背景描述 为了表达某一个属性,具备一组可选的范围,我们一般会采用两种方式.枚举类和数据字典,两者具有各自的优点.枚举类写在Java代码中,方便编写相应的判断逻辑,代码可读性高,枚举类中的属性是可提前预估和确定的.数据字典,一般保存在数据库,不便于编写判断和分支逻辑,因为数据如果有所变动,那么对应的代码逻辑很有可能失效,强依赖数据库数据的正确性,数据字典中对应的属性对业务影响并不大,日常开发中常用做分类,打标签使用,属性的多少无法估计. 目前基本上没有一个很好的全局处理枚举类的方案,所以我就自己综

  • Java手动方式创建枚举类示例

    本文实例讲述了Java手动方式创建枚举类.分享给大家供大家参考,具体如下: 一 点睛 可以采用如下设计方式手动创建枚举类 通过private将构造器隐藏起来. 把这个类的所有可能实例都使用public static final属性来保存. 如果有必要,可以提供一些静态方法,允许其他程序根据特定参数来获取与之匹配实例. 二 代码 1 Season.java public class Season { // 把Season类定义成不可变的,将其成员变量也定义成final的 private final

  • Java实现接口的枚举类示例

    本文实例讲述了Java实现接口的枚举类.分享给大家供大家参考,具体如下: 一 点睛 枚举类也可以实现一个或多个接口.与普通类实现一个或多个接口完全一样,枚举类实现一个或多个接口时,也需要实现该接口所包含的方法. 如果需要每个枚举值在调用同一个方法时呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法,每个枚举值提供不同的实现方式,从而让不同枚举值调用同一个方法时具有不同的行为方式. 二 实战 1 代码 GenderDesc.java public interface GenderDesc {

  • java枚举类的属性、方法和构造方法应用实战

    本文实例讲述了java枚举类的属性.方法和构造方法应用.分享给大家供大家参考,具体如下: 一 点睛 枚举类也是一种类,只是它是一种比较特殊的类,因此它一样可以使用属性和方法. 枚举类通常应该设计成不可变类,也就说它的属性值不应该允许改变,这样会更安全,而且代码更加简洁.为此,我们应该将枚举类的属性都使用private final修饰. 一旦为枚举类显式定义了带参数的构造器,则列出枚举值时也必须对应地传入参数. 二 简单枚举类实战 1 代码 Gender.java public enum Gend

  • Java包含抽象方法的枚举类示例

    本文实例讲述了Java包含抽象方法的枚举类.分享给大家供大家参考,具体如下: 一 点睛 可以在枚举类里定义一个抽象方法,然后把这个抽象方法交给各枚举值去实现即可. 枚举类里定义抽象方法时无需显式使用abstract关键字将枚举类定义成抽象类,但因为枚举类需要显式创建枚举值,而不是作为父类,所以定义每个枚举值时必须为抽象方法提供实现,否则将出现编译错误. 二 实战 1 代码 public enum Operation { PLUS { public double eval(double x , d

  • Java实现转跳不同系统使用枚举加switch的方式示例

    因有个判断需要处理不同系统类型跳转不同系统.考虑用switch + 枚举的方式. 具体使用案例如下: package com.b2b.common.constant; import com.base.utils.base.StringUtils; /** * 系统类型枚举 * @author shijing */ public enum SystemType { ERP(0,"ERP"), ORDER_PLATFORM(1,"订货平台"), PERSONAL(2,&

  • Java的枚举enum示例详解

    一. 什么是枚举 枚举是一种数据类型,具有集合的一些特点,可以存放多个元素,但存储对象有限且固定,枚举也有比较常见的使用场景,如我们需要表达性别(男.女),颜色(红.黄.蓝),星期(星期一.星期二...星期日),四季(春.夏.秋.冬),地理位置(东.西.南.北),方向(前.后.左.右)等,这些场景都非常适合枚举. 二. 定义枚举 java中使用enum来定义枚举,和class,interface具有同样的等级,(注意是enum,而不是Enum),定义枚举可以有两种情况 第一种:默认构造器(空构造

  • 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{ NotF

  • 详解Java中的 枚举与泛型

    详解Java中的 枚举与泛型 一:首先从枚举开始说起 枚举类型是JDK5.0的新特征.Sun引进了一个全新的关键字enum来定义一个枚举类.下面就是一个典型枚举类型的定义: public enum Color{ RED,BLUE,BLACK,YELLOW,GREEN } 显然,enum很像特殊的class,实际上enum声明定义的类型就是一个类. 而这些类都是类库中Enum类的子类(Java.lang.Enum).它们继承了这个Enum中的许多有用的方法.我们对代码编译之后发现,编译器将 enu

  • 扒一扒 Java 中的枚举类型

    前言 在 Java 中, 枚举, 也称为枚举类型, 其是一种特殊的数据类型, 它使得变量能够称为一组预定义的常量. 其目的是强制编译时类型安全. 枚举类更加直观,类型安全.使用常量会有以下几个缺陷: 1. 类型不安全.若一个方法中要求传入季节这个参数,用常量的话,形参就是int类型,开发者传入任意类型的int类型值就行,但是如果是枚举类型的话,就只能传入枚举类中包含的对象. 2. 没有命名空间.开发者要在命名的时候以SEASON_开头,这样另外一个开发者再看这段代码的时候,才知道这四个常量分别代

  • Java基础之枚举Enum类案例详解

    一.文章序言 Java中引用类型:数组.类.接口.枚举.注解 枚举这个既熟悉又陌生的东西具体再哪里可以使用呢? 什么是枚举? 枚举是一个引用类型,枚举就是一个规定了取值范围的变量类型. 枚举变量不能使用其他的数据,只能使用枚举中常量赋值.提高程序安全性: //格式: public enum 枚举名{ //枚举的取值范围 //枚举中可以生命方法 } 枚举的使用场景介绍? 1.最常见的情况如星期,相关变量我们会在Java里面重复使用,在这里我们就可以来定义一个叫做"星期"的枚举. publ

  • 深入浅出讲解Java中的枚举类

    目录 一.枚举类的使用 二.如何定义枚举类 背景:类的对象只有有限个,确定的.举例如下: > 星期: Monday (星期一).-.. Sunday (星期天) > 性别: Man (男). Woman (女) > 季节: Spring (春节).--.. Winter (冬天) > 支付方式: Cash (现金). WeChatPay (微信). Alipay (支付宝) BankCard (银 行卡). CreditCard (信用卡) > 就职状态: Busy . Fr

  • 教你如何用好 Java 中的枚举

    目录 1.概览 2.自定义枚举方法 3.使用 == 比较枚举类型 4.在 switch 语句中使用枚举类型 6.EnumSet and EnumMap 6.1. EnumSet 6.2. EnumMap 7. 通过枚举实现一些设计模式 7.1 单例模式 7.2 策略模式 8. Java 8 与枚举 9. Enum 类型的 JSON 表现形式 10. 补充 1.概览 enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承java.lang.Enum类,更多内容可以自行查看其官方文档

  • 四个实例超详细讲解Java 贪心和枚举的特点与使用

    目录 贪心: 枚举: 1.朴素枚举 2.状压枚举    算法题1: 示例 算法题2: 示例 算法题3:  示例1 示例2 算法题4:  示例1 笔试技巧:学会根据数据范围猜知识点          一般1s 时间限制的题目,时间复杂度能跑到 1e8 左右( python 和 java 会少一些,所以建议大家使用c/c++ 做笔试题). n 范围 20 以内: O(n*2^n) 状压搜索 /dfs 暴搜 n 范围 200 以内: O(n^3) 三维 dp n 范围 3000 以内: O(n^2)

  • 四个实例超详细讲解Java 贪心和枚举的特点与使用

    目录 贪心: 枚举: 1.朴素枚举 2.状压枚举 算法题1: 示例 算法题2: 示例 算法题3: 示例1 示例2 算法题4: 示例 笔试技巧:学会根据数据范围猜知识点 一般1s 时间限制的题目,时间复杂度能跑到 1e8 左右( python 和 java 会少一些,所以建议大家使用c/c++ 做笔试题). n 范围 20 以内: O(n*2^n) 状压搜索 /dfs 暴搜 n 范围 200 以内: O(n^3) 三维 dp n 范围 3000 以内: O(n^2) 二维 dp 背包 枚举 二维前

  • Java实例讲解枚举enum的实现

    目录 一.枚举介绍 1.自定义枚举实现 (1)示例 (2)测试结果 2.enum关键字实现枚举 (1)示例 (2)测试结果 3.enum关键字注意事项 (1)示例 一.枚举介绍 1.枚举是一组常量的集合 2.理解:美剧属于一种特殊的类,里面只包含一组有限的特定的对象 1.自定义枚举实现 1.不需要提供Set方法,枚举对象值通常为只读. 2.对枚举对象/属性使用final和static关键字修饰,实现底层优化 3.枚举对象名通常使用全部大写,常量的命名规范 4.枚举·对象根据需要,可以有一到多个属

  • 一文搞懂Java项目中枚举的定义与使用

    目录 什么是枚举 为什么需要枚举类 枚举类的定义和使用 什么是枚举 最近写新项目!有很多数据字典常量需要定义和使用.就顺便记录一下.什么是枚举类呢?就是用enum修饰是一种Java特殊的类,枚举是class.底层是继承了java.lang.Enum类的实体类.使用枚举可以很方便的定义数据常量.方便清晰我们使用 为什么需要枚举类 下面就举例说明一下吧 1)出于类型安全考虑,没用枚举类之前,常用静态常量来表示. 比如对于性别的表示: public static final int WOMAN = 0

随机推荐