状态机基础知识

这几天想研究下状态机,所以开始阅读了squirrel的代码,文档提到了建议先学习下状态机基础知识。所以学习了这方面的知识。

状态机的分类

按照uml2.4可以分为两种类型的状态机。分别是behavior state machine和protocol state machine。两种类型的状态机有很多相似之处,behavior state machine更关注行为的变化,protocol state machine则可以描述系统内的状态变化的生命周期(比如Java线程的生命周期)。

behavior state machine

  • 示意图
    状态机基础知识_第1张图片
    image

    首先看个状态机的示意图,主要描述的是银行ATM自助取款机的状态变化。
    这里面有一些概念,大的可以分为vertex和transition。

vertex

如果把状态机看作是个图(graph)的话,可以把vertex看作图的状态节点。可以分为如下两种

state

state可以描述状态,可以分为三种类型。分别是简单状态(simple state),复合状态(composite state), 子状态(submachine state)。

  • 简单状态


    状态机基础知识_第2张图片
    简单状态.png
  • 复合状态
    在简单状态中可以嵌套其他的状态变化,如下图


    状态机基础知识_第3张图片
    复合状态.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


    状态机基础知识_第4张图片
    进入节点
  • Exit Point


    状态机基础知识_第5张图片
    退出节点
  • Choice
    状态机基础知识_第6张图片
    选择分支
  • Fork


    状态机基础知识_第7张图片
    多线程派发
  • Join


    线程归并
  • Junction


    状态机基础知识_第8张图片
    结合
  • Shallow History Pseudostate
    包含H的圆圈


    状态机基础知识_第9张图片
    浅复制
  • 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可以描述对象的生命周期。先看个示意图

  • 示意图
    状态机基础知识_第10张图片
    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

你可能感兴趣的:(状态机基础知识)