java 有限状态机_有限状态机( Finite State Machine )JAVA 版
介绍
有限状态机通常用于模拟序列逻辑,换句话说,就是用于代表和控制执行流程。
有限状态机所需条件:
一个物体只有固定的几种状态(例如交通灯只有绿灯、黄灯和红灯三个状态)。
有固定的变化顺序(例如交通灯只能绿灯->黄灯->红灯->绿灯循环)
物体同一时间点上只有一种状态。
例子
这里拿一个空调做例子,图是用了别人的,这里说明下下面三个状态的意思:
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 版相关推荐
- 状态模式 有限状态机_有限状态机解释
状态模式 有限状态机 The finite state machine (FSM) is a software design pattern where a given model transitio ...
- 有限状态机FSM(Finite State Machine)及实现方式介绍(转)
原文:https://www.cnblogs.com/barrywxx/p/12860573.html 一.为什么引入有限状态机? 最近做一个项目,项目中很多实体(Entity),每个实体都有很多状态 ...
- 有限状态机FSM(finite state machine) 二
有限状态机FSM(finite state machine) 二 延续上一篇继续有限状态机 上一篇中的状态切换判断是在每一个状态类的 OnExecute 方法中各种 if else 硬编码逻辑 当状态 ...
- FSM(Finite State Machine,有限状态机)设计
有限状态机(Finite State Machine, FSM),根据状态机的输出是否与输入有关,可分为Moore型状态机和Mealy型状态机.Moore型状态机输出仅仅与现态有关和Mealy型状态机 ...
- 《计算机组成与CPU设计实验》5有限状态机的Verilog HDL描述(Finite State Machine,FSM)
多数控制逻辑都可以用有限状态机描述 状态机 状态机是组合逻辑和时序逻辑的特殊组合 时序逻辑用于存储状态 组合逻辑用于产生次态和产生输出 状态的数量是有限的,故称为有限状态机(Finite State ...
- 有限状态机FSM(finite state machine) 一
有限状态机FSM(finite state machine) 一 有限状态机又称有限自动状态机,它拥有有限数量的状态,每个状态代表不同的意义,每个状态可以切换到 零-多 个状态.任意时刻状态机有且只能 ...
- 证明与计算(7): 有限状态机(Finite State Machine)
什么是有限状态机(Finite State Machine)? 什么是确定性有限状态机(deterministic finite automaton, DFA )? 什么是非确定性有限状态机(nond ...
- java书籍_非科班,自学java需要把软件工程的课程全部学习完吗?
问题一:非科班是否能自学Java.问题二:自学Java是否需要把软件工程课程全部学完?问题三:如何自学Java? 解决问题一:非科班是否能自学Java.不知道你是否有这个担心疑虑,从事Java技术开发 ...
- 如何java面试_短时间如何过java面试?
这题我会!作为一个编程界老司机,我曾总结过一套Java常见的面试考点大全,不知道帮助过多少程序员拿下offer. 现在我把这套Java面试大全放出来,希望对大家有所帮助! 本文内容过长,建议大家先赞后 ...
- 修改docker内java内存_在docker中使用java的内存情况
Java和Docker不是天然的朋友. Docker可以设置内存和CPU限制,而Java不能自动检测到.使用Java的Xmx标识(繁琐/重复)或新的实验性JVM标识,我们可以解决这个问题. 虚拟化中的 ...
最新文章
- codility上的问题 (22)
- 它指导了计算机行业大半个世纪的发展,如今却要走下神坛?
- git branch用法总结
- CVPR-2021收集
- 2.2.1 静态成员
- android 非root app 捕捉系统广播_APP的生死之道
- 有关 input默认宽度
- 国内git clone报错问题解决办法
- php的require 失败,PHP在require_once上失败
- 运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统
- 利用Linux系统生成随机密码的8种方法
- Android Studio 将github作为远程maven仓库
- 从零开始的Python学习Episode 20——面向对象(3)
- Java RMI(远程方法调用)入门
- CardView介绍
- 小程序访问第三方服务器,第三方微信小程序服务器地址设置
- 大型计算机 内存,PC 新时代!DDR5 内存规范正式发布:最高速度达 6.4Gbps,单芯片密度达 64Gbit...
- VMware VMFS分区表恢复
- Rasa课程、Rasa培训、Rasa面试系列之:Rasa客户案例PicPay公司
- Python学习之集合练习(协助学生做问卷调查)
热门文章
- TCPDUMP 用法(转)
- 英特尔:赔你15亿算了;Nvidia:反正我早就不做你那块了
- 小知识-Spring Boot是如何确定当前运行环境
- 设计模式 (十四) Cglib动态代理模式
- RabbitMQ消息持久化总结
- Java并发编程之安全发布对象的四种方法
- nrf52832-定时器例程
- oracle报错ORA-01843: not a valid month
- 第 3 章 sqlmap - automatic SQL injection and database takeover tool
- window.onerror=hide_error_message;