状态机简单介绍

本文作者:The Reborn
本文链接:https://www.cnblogs.com/lisongzzx/p/13641206.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!

一、状态机要素

可以把状态机的要素分为4个要素,即:现态、条件、动作、次态。
“现态”和“条件”是因,“动作”和“次态”是果。

(1)现态:是指当前所处状态;
(2)条件:又称为“事件”。当条件被满足时,将会触发一个动作,或者执行一次状态的迁移。
(3)动作:条件满足后执行的动作。动作不是必须的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
(4)次态:条件满足后要迁移往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

二、状态迁移图(STD)

请添加图片描述
(1)状态框:用方框表示状态,包括所谓的“现态”和“次态”;
(2)条件及迁移箭头:用箭头表示状态迁移的方向,并在该箭头上标注触发条件;
(3)节点圆圈:当多个箭头指向一个状态时,可以用节点符号(小圆圈)连接汇总;
(4)动作框:用椭圆框表示;
(5)附加条件判断框:用六角菱形框表示;

三、状态迁移表

请添加图片描述请添加图片描述

四、用状态机思路实现一个时钟程序

首先我们画出他的状态迁移图:
请添加图片描述

然后我们画出状态迁移表:
请添加图片描述

五、状态机应用注意事项:

注意使用状态机的时候不要出现两种错误:1、“伪态”2、“漏态”
(1)“伪态”:把某个“程序动作”当成一种“状态”来处理。
(2)“漏态”:在状态划分时漏掉一些状态。

PS:

区分状态和伪态:(看两者的本质)
“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;
“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。

六、更复杂的状态机

前面介绍的是一种简单的状态结构。它只有一级,并且只有一维,它的结构图如下所示:
请添加图片描述

如果有必要,我们可以建立更复杂的状态机模型。如:

1、多级状态结构。
状态机可以是多级的。在分层的多级状态机系统里面,一个“父状态”下可以划分多个“子状态”,这些子状态共同拥有上级父状态的某些共性,同时又各自拥有自己的一些个性。
请添加图片描述

2、多维状态结构。
状态机也可以是多维的。从不同的角度对系统进行状态的划分,这些状态的某些特性是交叉的。比如,在按照按键和显示划分状态的同时,又按照系统的工作进程做出另一种状态划分。这两种状态划分同时存在,相互交叉。从而构成了二维的状态结构空间。
请添加图片描述
说明一下,每一维的状态都需要用一个状态变量(寄存器)来表示。

状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:


①现态:是指当前所处的状态。
②条件:又称为“事件”,当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

要注意状态必须要有始有终,否则会出现状态卡住,无法继续正常推进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值