【通俗易懂】什么是状态机?
前言
状态机在实际工作开发中应用非常广泛,在刚进入公司的时候,根据公司产品做流程图的时候,发现自己经常会漏了这样或那样的状态,导致整体流程会有问题,后来知道了状态机这样的东西,发现用这幅图就可以很清晰的表达整个状态的流转。
很多协议的开发都必须用到状态机;一个健壮的状态机可以让你的程序,不论发生何种突发事件都不会突然进入一个不可预知的程序分支。
本篇文章带你简单了解一下状态机
什么是状态机?
定义
状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。
先来解释什么是“状态”( State )。现实事物是有不同状态的,例如一个LED等,就有 亮 和 灭两种状态。我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限个,例如LED灯的状态就是两个 亮和 灭。
状态机,也就是 State Machine ,不是指一台实际机器,而是指一个数学模型。说白了,一般就是指一张状态转换图。
举例
以物理课学的灯泡图为例,就是一个最基本的小型状态机
可以画出以下的状态机图
这里就是两个状态:①灯泡亮,②灯泡灭
如果打开开关,那么状态就会切换为 灯泡亮 。灯泡亮 状态下如果关闭开关,状态就会切换为 灯泡灭。
状态机的全称是有限状态自动机,自动两个字也是包含重要含义的。给定一个状态机,同时给定它的当前状态以及输入,那么输出状态时可以明确的运算出来的。例如对于灯泡,给定初始状态灯泡灭 ,给定输入“打开开关”,那么下一个状态时可以运算出来的。
四大概念
下面来给出状态机的四大概念。
State ,状态。一个状态机至少要包含两个状态。例如上面灯泡的例子,有 灯泡亮和 灯泡灭两个状态。
Event ,事件。事件就是执行某个操作的触发条件或者口令。对于灯泡,“打开开关”就是一个事件。
Action ,动作。事件发生以后要执行动作。例如事件是“打开开关”,动作是“开灯”。编程的时候,一个 Action 一般就对应一个函数。
Transition ,变换。也就是从一个状态变化为另一个状态。例如“开灯过程”就是一个变换。
以上就是状态机的简单介绍了,如果想进一步学习,可以参考这篇文章——>状态机详解
【通俗易懂】什么是状态机?相关推荐
- ospf状态机-通俗易懂的小故事
阅读本文大概需要 5 分钟. 公众号:工程师江湖 * 故事:一个名字叫做ospf状态机的故事* 很久很久以前,有一个区域,这个区域叫做 自治系统AS,在AS内部有很多管理员,管理员来有个别名叫做IGP ...
- 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)
前言 读完上篇<通俗易懂,C#如何安全.高效地玩转任何种类的内存之Span(一)>,相信大家对span的本质应该非常清楚了.含着金钥匙出生的它,从小就被寄予厚望要成为.NET下编写高性能应 ...
- [通俗易懂]深入理解TCP协议(下):RTT、滑动窗口、拥塞处理
转自即时通讯网:http://www.52im.net/ 前言 此文为系列文章的下篇,如果你对TCP不熟悉的话,请先看看上篇<[通俗易懂]深入理解TCP协议(上):理论基础> . 上篇中, ...
- [通俗易懂]深入理解TCP协议(上):理论基础
转自即时通讯网:http://www.52im.net/ 前言 TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的 ...
- QT学习之状态机框架
状态机框架 创建状态机
- 如何保证Qt状态机的最佳性能
如何保证Qt状态机的最佳性能 How to ensure the best Qt state machine performance 如果您使用Qt进行应用程序开发,并且使用状态机,那么很可能您正在使 ...
- 用测试驱动开发状态机
用测试驱动开发状态机 Developing state machines with test-driven development 由于状态机模型在嵌入式系统中的广泛应用,本文探讨了在测试驱动开发(T ...
- Java注解---通俗易懂
本文转载于Java注解-最通俗易懂的注解 Annotation 中文译过来就是注解.标释的意思,在 Java 中注解是一个很重要的知识点,但经常还是有点让新手不容易理解. 我个人认为,比较糟糕的技术文 ...
- SharePoint 工作流解决方案(一):顺序工作流和状态机工作流
SharePoint 的工作流是基于 Workflow Foundation 的,我们就先谈谈 WF,只有对 WF 有正确的认识,才能找到 SharePoint 工作流的解决方案. Workflow ...
最新文章
- Hibernate flush理解
- option 82与DHCP中继代理
- postman设置测试环境
- CentOS7-64bit 编译 Hadoop-2.5.0,并分布式安装
- Morphling:云原生部署 AI ,如何把降本做到极致?
- 鬼才项斌,用人工智能推动教育服务创新
- 网址的bibtex格式
- 学习Java之前的一些话
- linux内存专题,linux内存浅析
- 视频封面自动播放两秒钟html,使用videojs轻松搭建一个播放器
- 国家气象数据中心网站
- Java链表入门(超详细)
- c语言自动画波形程序,【小程序】C语言实现简易钢琴-利用sin函数构造不同频率波形模拟各琴键发音...
- pyqt5 图片随窗口变化等比例缩放
- Python数据类型—数值型
- 计算机专业调研报告图片,计算机专业毕业设计论文(计算机专业调研报告范文)...
- 前后端交互:form表单与模板引擎
- PS色彩算法理解记录 1 Darken Lighten
- 合同索赔的内容和处理方法
- 项目中使用过的Soc
热门文章
- VC使用HTTP协议下载文件
- 有赞统一接入层架构演进
- C++ STL : 模拟实现STL中的string类
- JDBC连接失败java.sql.SQLException: ...ClassCastException: BigInteger cannot be cast to Long
- 腾讯TencentOS 十年云原生的迭代演进之路
- Django视图(二)
- LiveVideoStackCon 2018 注册通道即将关闭
- Navicat Premium 12安装及常用快捷键
- 腾讯大数据高级产品总监洪桃李:决胜未来的4大关键能力
- 云原生存储项目ROOK