目录
一、相关概念
1.定义:
状态机图描述单个对象随时间变化的行为的动态模型
包含一个类的对象在其生命周期期间的所有状态的序列以及对象对接收到的事件所产生的反应
2.基本元素:
状态,转换
状态用圆角矩形表示,初态是一个实心圆,终态是一个圆形内嵌原点
3.状态
由名称,进入退出动作,内部转换,子状态和延迟事件构成
1)名称
状态可以没有名称
2)进入退出动作
顾名思义在进入和退出这个状态所执行的动作,可以没有参数
动作具有原子性(即不可以中途中断,可以理解为在较少的时间内完成)
通过这个操作可以不必精确将操作放在输入或输出转移上
3)内部转换
就是事件的执行不会引起状态的变化
可能会带有参数或警戒条件
通常在出入口事件没必要的情况下使用
比如,一个状态的出入口事件分别为关闭和打开某文件,当我只想修改文件名时根本不需要这两个事件
4)子状态
嵌套在另一个状态中的状态
简单状态是没有子结构的状态,组合状态(复合状态)是具有子状态的状态
嵌套的状态最多只有一个初态和一个终态
顺序子状态:按顺序一个一个来
并发子状态:并发状态同时进行
两并发状态间用虚线隔开
5)延迟事件
就是有这么个事件不能让它立刻就执行,就延迟它,直到它不是延迟状态了才会被拿出来执行
6)转换
就是在源状态那本来干着个事但是突然触发了什么事件,就进入了目标状态
由源状态,触发事件,监护条件,动作,目标状态组成
源状态:激发前的状态
触发条件:引起转变的事件,可以带参数
监护条件:触发事件发生后对监护条件进行求值,真则转移,假则不转移
方括号括起来放在触发条件后面
动作:转换发生时动作就被执行,是一个原子性的(就是要么一下都执行完,要么不执行,不存在执行一半的现象)
目标状态:转换完成后的状态
二、构建状态机图
步骤:
寻找主要状态
确定状态之间的转换
细化状态内的活动与转换
在这个过程中可以把自己想象成这个不停变换状态的系统来找状态,然后再把自己作为一个操作者来找动作
三、例子
1.打电话的行为建模
电话空闲时,用户拨号进入拨号状态,呼叫成功则电话接通处于通话状态,呼叫不成功,则回到空闲状态
电话空闲时被呼叫,进入响铃状态,用户接听则处于通话状态,完成后回到空闲状态,用户不接听则继续响铃,用户挂断则回到空闲状态
可见总共有空闲,拨号,通话,响铃四种状态
有拨号,拨号不通,接通电话,通话完毕,来电,拒接电话无人接听这几种动作
可以绘制状态机图如下:
2.航班预定
一开始肯定是无预定的状态,在订票的过程中肯定是部分预定状态,逐渐订满则是预定完状态,最后起飞要是预定关闭状态
其中肯定要有预定和退订这个动作,以及最后起飞时要关闭的操作,还有如果没有人坐这个飞机了那肯定要取消航班
3.登陆系统
回想一下登陆流程,输入账号,密码,现在把你自己想象成这个系统,首先你要获取到用户输入的账号,进行验证,然后获取到密码再进行验证,最后验证成功就通过,不成功就拒绝(这里可以设置成一个类似循环的存在
所以这里就存在获取账号状态,获取密码状态,验证状态,拒绝状态