这几天想研究下状态机,所以开始阅读了squirrel的代码,文档提到了建议先学习下状态机基础知识。所以学习了这方面的知识。
状态机的分类
按照uml2.4可以分为两种类型的状态机。分别是behavior state machine和protocol state machine。两种类型的状态机有很多相似之处,behavior state machine更关注行为的变化,protocol state machine则可以描述系统内的状态变化的生命周期(比如Java线程的生命周期)。
behavior state machine
-
示意图
image
首先看个状态机的示意图,主要描述的是银行ATM自助取款机的状态变化。
这里面有一些概念,大的可以分为vertex和transition。
vertex
如果把状态机看作是个图(graph)的话,可以把vertex看作图的状态节点。可以分为如下两种
state
state可以描述状态,可以分为三种类型。分别是简单状态(simple state),复合状态(composite state), 子状态(submachine state)。
-
简单状态
简单状态.png -
复合状态
在简单状态中可以嵌套其他的状态变化,如下图
复合状态.png
这个复合状态中,Nothing有子状态idle,Configuring有子状态NewValueSelection和NewValuePreview,NewValuePreview有两个子状态state1,state2。
- 子状态机
这个url文档原话说的是The state machine that contains the submachine state is called the containing state machine.怎么理解这句话呢?我的理解是父类状态机包含子类状态机的状态。实际场景就是主子订单,1笔主订单可能包含多笔子订单,主订单和子订单都有订单状态,比如待支付,已支付,已取消,配送中,售后中等。
Pseudostate
有如下几种类型,简单可以理解为一些预定义的状态。
-
Initial Pseudostate
初始化 -
Terminate Pseudostate
结束 -
Entry Point
进入节点 -
Exit Point
退出节点 - Choice 选择分支
-
Fork
多线程派发 -
Join
线程归并 -
Junction
结合 -
Shallow History Pseudostate
包含H的圆圈
浅复制 -
Deep History Pseudostate
包含H*的圆圈 -
Final State
uml定义其为state的子类,但是不是一种pseudostate
结束状态
transition
vertex对应状态机图上的节点,transition就有对应的转换。转换一般如下描述
transition ::= [ triggers ] [ guard ] [ '/' behavior-expression ]
triggers是触发事件,guard是检查是否能触发的约束,behavior-expression是触发后会执行的动作。
举个例子,
left-mouse-down(coordinates) [coordinates in active_window] / link:=select-link(coordinates);link.follow()
按下鼠标左键(left-mouse-down(coordinates) )是一个trigger,但是不一定会触发,需要满足guard约束(坐标需要在激活的窗口 ),如果满足就会触发behavior:link和link.follow。
behavior state machine小结
重新看上面的behavior state machine示意图,应该就很好理解了。注意下Customer Authentication和Transaction中的两个圆圈是Decomposition compartment ,简单可以理解为隐藏其中的细节。
protocol state machine
大致内容和上面一样,protocol state machine可以描述对象的生命周期。先看个示意图
-
示意图
User Account
protocol state machine的transition和上面的有点不同,它的表达式是
protocol-transition ::= [ pre-condition ] [trigger](https://www.uml-diagrams.org/common-behaviors.html#trigger-syntax) '/' [ post-condition ]
举个例子,上面的图New到Active,pre-condition是验证账户(比如身份证,手机号),激活账号(trigger),post-condition(验证唯一性)。
参考资料
https://www.uml-diagrams.org/state-machine-diagrams.html
https://doc.qt.io/archives/qt-4.8/statemachine-api.html
https://sparxsystems.com/resources/tutorials/uml2/state-diagram.html
https://plantuml.com/zh/state-diagram
网友评论