介绍

有限状态机通常用于模拟序列逻辑,换句话说,就是用于代表和控制执行流程。

有限状态机所需条件:

一个物体只有固定的几种状态(例如交通灯只有绿灯、黄灯和红灯三个状态)。

有固定的变化顺序(例如交通灯只能绿灯->黄灯->红灯->绿灯循环)

物体同一时间点上只有一种状态。

例子

这里拿一个空调做例子,图是用了别人的,这里说明下下面三个状态的意思:

Off:空调关机

FanOnly:空调仅吹风

Cool:空调制冷

原始的解决办法

StateEnum

用枚举类定义三种状态

package org.example.origin;

public enum StateEnum {

POWER_OFF, FAN_ONLY, COOL

}

OriginAction

pressPowerOff() 表示点开关按钮,pressCool() 表示点击制冷按钮。

package org.example.origin;

public class OriginAction {

private StateEnum stateEnum;

public OriginAction() {

this.stateEnum = StateEnum.POWER_OFF;

}

public void pressPowerOff() {

// 关机->吹风

if (stateEnum == StateEnum.POWER_OFF) {

this.stateEnum = StateEnum.FAN_ONLY;

System.out.println("Power on succeed.");

} else {

// 吹风或制冷->关机

this.stateEnum = StateEnum.POWER_OFF;

System.out.println("Power off succeed.");

}

}

public void pressCool() {

if (stateEnum == StateEnum.POWER_OFF) {

System.out.println("Cool failed because power off.");

} else if (stateEnum == StateEnum.FAN_ONLY) {

// 吹风->制冷

this.stateEnum = StateEnum.COOL;

System.out.println("Open cool succeed.");

} else {

// 制冷->吹风

this.stateEnum = StateEnum.FAN_ONLY;

System.out.println("Close cool succeed");

}

}

}

OriginTest

编写测试类

package org.example.origin;

public class OriginTest {

public static void main(String[] args) {

OriginAction originAction = new OriginAction();

originAction.pressCool();

originAction.pressPowerOff();

originAction.pressCool();

originAction.pressCool();

originAction.pressPowerOff();

}

}

执行结果:

Cool failed because power off.

Power on succeed.

Open cool succeed.

Close cool succeed

Power off succeed.

使用有限状态机解决

FiniteStateMachineEnum

这里使用了 Java 的枚举类,确保了类型约束。

package org.example.state;

public enum FiniteStateMachineEnum {

POWER_OFF {

// 关机->吹风

@Override

public FiniteStateMachineEnum pressPowerOff() {

System.out.println("Power on succeed.");

return FiniteStateMachineEnum.FAN_ONLY;

}

// 无效

@Override

public FiniteStateMachineEnum pressCool() {

System.out.println("Cool failed because power off.");

return FiniteStateMachineEnum.POWER_OFF;

}

},

FAN_ONLY {

// 吹风->关机

@Override

public FiniteStateMachineEnum pressPowerOff() {

System.out.println("Power off succeed.");

return FiniteStateMachineEnum.POWER_OFF;

}

// 吹风->制冷

@Override

public FiniteStateMachineEnum pressCool() {

System.out.println("Open cool succeed.");

return FiniteStateMachineEnum.COOL;

}

},

COOL {

// 制冷->关机

@Override

public FiniteStateMachineEnum pressPowerOff() {

System.out.println("Power off succeed.");

return FiniteStateMachineEnum.POWER_OFF;

}

// 制冷->吹风

@Override

public FiniteStateMachineEnum pressCool() {

System.out.println("Close cool succeed");

return FiniteStateMachineEnum.FAN_ONLY;

}

};

public abstract FiniteStateMachineEnum pressPowerOff();

public abstract FiniteStateMachineEnum pressCool();

}

FiniteStateMachineTest

编写测试类

package org.example.state;

public class FiniteStateMachineTest {

public static void main(String[] args) {

FiniteStateMachineEnum stateEnum = FiniteStateMachineEnum.POWER_OFF;

stateEnum.pressCool()

.pressPowerOff()

.pressCool()

.pressCool()

.pressPowerOff();

}

}

执行结果:

Cool failed because power off.

Power on succeed.

Open cool succeed.

Close cool succeed

Power off succeed.

总结

两种方法的运行结果是一样的,但是有限状态机的写法更加简洁明了。传统方法在简单的条件下还可以应付,但是如果面对复杂的执行逻辑顺序,只有通过有限状态机来解决了,而且代码更加简洁明了,易于维护。

java 有限状态机_有限状态机( Finite State Machine )JAVA 版相关推荐

  1. 状态模式 有限状态机_有限状态机解释

    状态模式 有限状态机 The finite state machine (FSM) is a software design pattern where a given model transitio ...

  2. 有限状态机FSM(Finite State Machine)及实现方式介绍(转)

    原文:https://www.cnblogs.com/barrywxx/p/12860573.html 一.为什么引入有限状态机? 最近做一个项目,项目中很多实体(Entity),每个实体都有很多状态 ...

  3. 有限状态机FSM(finite state machine) 二

    有限状态机FSM(finite state machine) 二 延续上一篇继续有限状态机 上一篇中的状态切换判断是在每一个状态类的 OnExecute 方法中各种 if else 硬编码逻辑 当状态 ...

  4. FSM(Finite State Machine,有限状态机)设计

    有限状态机(Finite State Machine, FSM),根据状态机的输出是否与输入有关,可分为Moore型状态机和Mealy型状态机.Moore型状态机输出仅仅与现态有关和Mealy型状态机 ...

  5. 《计算机组成与CPU设计实验》5有限状态机的Verilog HDL描述(Finite State Machine,FSM)

    多数控制逻辑都可以用有限状态机描述 状态机 状态机是组合逻辑和时序逻辑的特殊组合 时序逻辑用于存储状态 组合逻辑用于产生次态和产生输出 状态的数量是有限的,故称为有限状态机(Finite State ...

  6. 有限状态机FSM(finite state machine) 一

    有限状态机FSM(finite state machine) 一 有限状态机又称有限自动状态机,它拥有有限数量的状态,每个状态代表不同的意义,每个状态可以切换到 零-多 个状态.任意时刻状态机有且只能 ...

  7. 证明与计算(7): 有限状态机(Finite State Machine)

    什么是有限状态机(Finite State Machine)? 什么是确定性有限状态机(deterministic finite automaton, DFA )? 什么是非确定性有限状态机(nond ...

  8. java书籍_非科班,自学java需要把软件工程的课程全部学习完吗?

    问题一:非科班是否能自学Java.问题二:自学Java是否需要把软件工程课程全部学完?问题三:如何自学Java? 解决问题一:非科班是否能自学Java.不知道你是否有这个担心疑虑,从事Java技术开发 ...

  9. 如何java面试_短时间如何过java面试?

    这题我会!作为一个编程界老司机,我曾总结过一套Java常见的面试考点大全,不知道帮助过多少程序员拿下offer. 现在我把这套Java面试大全放出来,希望对大家有所帮助! 本文内容过长,建议大家先赞后 ...

  10. 修改docker内java内存_在docker中使用java的内存情况

    Java和Docker不是天然的朋友. Docker可以设置内存和CPU限制,而Java不能自动检测到.使用Java的Xmx标识(繁琐/重复)或新的实验性JVM标识,我们可以解决这个问题. 虚拟化中的 ...

最新文章

  1. codility上的问题 (22)
  2. 它指导了计算机行业大半个世纪的发展,如今却要走下神坛?
  3. git branch用法总结
  4. CVPR-2021收集
  5. 2.2.1 静态成员
  6. android 非root app 捕捉系统广播_APP的生死之道
  7. 有关 input默认宽度
  8. 国内git clone报错问题解决办法
  9. php的require 失败,PHP在require_once上失败
  10. 运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统
  11. 利用Linux系统生成随机密码的8种方法
  12. Android Studio 将github作为远程maven仓库
  13. 从零开始的Python学习Episode 20——面向对象(3)
  14. Java RMI(远程方法调用)入门
  15. CardView介绍
  16. 小程序访问第三方服务器,第三方微信小程序服务器地址设置
  17. 大型计算机 内存,PC 新时代!DDR5 内存规范正式发布:最高速度达 6.4Gbps,单芯片密度达 64Gbit...
  18. VMware VMFS分区表恢复
  19. Rasa课程、Rasa培训、Rasa面试系列之:Rasa客户案例PicPay公司
  20. Python学习之集合练习(协助学生做问卷调查)

热门文章

  1. TCPDUMP 用法(转)
  2. 英特尔:赔你15亿算了;Nvidia:反正我早就不做你那块了
  3. 小知识-Spring Boot是如何确定当前运行环境
  4. 设计模式 (十四) Cglib动态代理模式
  5. RabbitMQ消息持久化总结
  6. Java并发编程之安全发布对象的四种方法
  7. nrf52832-定时器例程
  8. oracle报错ORA-01843: not a valid month
  9. 第 3 章 sqlmap - automatic SQL injection and database takeover tool
  10. window.onerror=hide_error_message;