状态机适用场景:

C的操作,需要等到A、B的两个操作(A、B顺序操作),那就需要在 A、B之间创建一个状态机(state machine),C的操作需要状态机达到某一个状态才能进行

1. Overview

java版的状态机的原理其实就是java中的枚举类Enum,所以在进行状态机设计之前,先学习一下(回顾一个java Enum)

2. Java Enums

一个简单的例子:员工请假系统,员工到HR那离(submitted)-> 部门领导(Escalated) -> 部门经理(Approved)

public enum LeaveRequestState {
Submitted,
Escalated,
Approved
}

我们可以这样引用:

LeaveRequestState state = LeaveRequestState.Submitted;
 java的枚举也可以包含方法,我们可以在枚举类中写一个抽象方法(abstract),这样枚举类中的每个成员都会继承该方法,这个就是java版状态机的核心所在
public enum LeaveRequestState {
Submitted {
@Override
public String responsiblePerson() {
return "Employee";
}
},
Escalated {
@Override
public String responsiblePerson() {
return "Team Leader";
}
},
Approved {
@Override
public String responsiblePerson() {
return "Department Manager";
}
}; public abstract String responsiblePerson();
}

注意上面的逗号,以及抽象方法前的分号

 

在下面的例子中, 我们使用上面代码中的 responsiblePerson() 方法. 这就是一个典型的状态机. 我们想知道"Escalated "的“状态”(实际是审批人), 那就会返回结果 “Team Leader”:

LeaveRequestState state = LeaveRequestState.Escalated;
assertEquals("Team Leader", state.responsiblePerson());

同样的  “Department Manager”:

LeaveRequestState state = LeaveRequestState.Approved;
assertEquals("Department Manager", state.responsiblePerson());

3. State Machines

状态机又称有限状态机,是一个建立在抽象机器上的计算模型,这个状态机在给定的时间内,只能有一个状态,而每一个状态又可以转换为其他状态(其他状态也是我们自己定义的)

4. Enums as State Machines

public enum LeaveRequestState {

    Submitted {
@Override
public LeaveRequestState nextState() {
return Escalated;
} @Override
public String responsiblePerson() {
return "Employee";
}
},
Escalated {
@Override
public LeaveRequestState nextState() {
return Approved;
} @Override
public String responsiblePerson() {
return "Team Leader";
}
},
Approved {
@Override
public LeaveRequestState nextState() {
return this;
} @Override
public String responsiblePerson() {
return "Department Manager";
}
}; public abstract LeaveRequestState nextState();
public abstract String responsiblePerson();
}
LeaveRequestState state = LeaveRequestState.Submitted;

state = state.nextState();
assertEquals(LeaveRequestState.Escalated, state); state = state.nextState();
assertEquals(LeaveRequestState.Approved, state); state = state.nextState();
assertEquals(LeaveRequestState.Approved, state);

java版的状态机实现的更多相关文章

  1. 编写你的第一个 Java 版 Raft 分布式 KV 存储

    前言 本文旨在讲述如何使用 Java 语言实现基于 Raft 算法的,分布式的,KV 结构的存储项目.该项目的背景是为了深入理解 Raft 算法,从而深刻理解分布式环境下数据强一致性该如何实现:该项目 ...

  2. ArcGIS Server 10 Java 版的Rest服务手动配置方法

    Java版的Manager中发布的服务默认只发布了该服务的SOAP接口,而REST接口需要用户在信息服务器,如Tomcat. Apache.WebLogic等中手工配置.由于在Java版的Server ...

  3. PetaPojo —— JAVA版的PetaPoco

    背景 由于工作的一些原因,需要从C#转成JAVA.之前PetaPoco用得真是非常舒服,在学习JAVA的过程中熟悉了一下JAVA的数据组件: MyBatis 非常流行,代码生成也很成熟,性能也很好.但 ...

  4. 【转载】java版打字练习软件

    网上找到一个java版的打字的游戏 import java.applet.Applet; import java.applet.AudioClip; import java.awt.Dimension ...

  5. 微博地址url(id)与mid的相互转换 Java版

    原理: 新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ这样三部分. 第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分 ...

  6. JCEF3——谷歌浏览器内核Java版实现(一):使用jawt获取窗体句柄

    前言 最近一段时间研究谷歌浏览器内核.谷歌浏览器内核一直开源,并维护更新,它的开源项目中内核更新速度和Chrome浏览器版本更新进度一样!而且它不同于WebKit(值得一题的是谷歌浏览器已不使用Web ...

  7. Selenium关键字驱动测试框架Demo(Java版)

    Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html

  8. 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容

    第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...

  9. 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

随机推荐

  1. 超快速度下载MNIST数据集

    Download mnist dataset and extract in 1 second! For Caffe users: create $CAFFE/data/mnist/get_mnist_ ...

  2. angular6 使用daterangepicker的注意事项

    具体使用方法可参考这篇博客:https://blog.csdn.net/qq_43225030/article/details/84973086 需要注意的地方是,在dateRangePicker函数 ...

  3. Linux服务器PHP后门查杀

    shell脚本一句话查找PHP一句话木马 # find ./ -name "*.php" |xargs egrep "phpspy|c99sh|milw0rm|eval( ...

  4. Linux下bash的一些总结

    关于"交互式-非交互式"与"登录-非登陆"shell的总结 关于".bash_profile"和".bashrc"区别的 ...

  5. python参数传递

    1.形式参数:在定义函数时,函数名后面括号中的参数为“形式参数”,也称形参 2.实际参数:在调用一个函数时,函数名后面括号种的参数为“实际参数”,也就是将函数的调用者提供给函数的参数称为实际参数,也称 ...

  6. 排序算法-希尔排序(Java)

    package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className ShellSort * @date 201 ...

  7. OpenCV 学习笔记(14)为轮廓创建边界旋转框和椭圆

    https://docs.opencv.org/3.4/de/d62/tutorial_bounding_rotated_ellipses.html 不旋转 #include "opencv ...

  8. 云服务器使用: 为域名申请SSl证书

    注:咱们平时访问网站 有的是http  有的是 https https就是说使用了SSL访问 然后就是等着..... 假设可以了 然后就会有各个软件使用的证书,然后根据自己安装的软件下载证书

  9. 10-排序6 Sort with Swap(0, i) (25 分)

    Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy to sort them in increasing order ...

  10. vue+element 表单验证

    效果图 <template> <div class="formValidator"> <div v-for="(item,index) in ...