定义: 对象在其生命周期对某些不变条件成立的情况的一种状况,处于某个特定状态中的对象必然会满足某些条件、执行某些动作或者是等待某些事件。
1 定义
状态(state)
定义: 对象在其生命周期对某些不变条件成立的情况的一种状况,处于某个特定状态中的对象必然会满足某些条件、执行某些动作或者是等待某些事件。
1 | ex: 电梯在从开始到坏掉过程中(生命周期): |
理解
状态的存在:对象在不变条件成立的情况下任何时刻都会处于某种状态之中
状态的转移:事件使对象从一个状态转向另一个状态
当面对所检测到的事件或所接收到的消息时,对象所处的状态不同,做出的反应也不同。(例如:手机home键,在手机充电,锁屏,听歌等状态下按下去显示不同)
状态机(state machine)
用于描述一个对象在其生命周期中的动态行为。
表现对象响应事件所经历的状态序列以及伴随的动作
状态图和活动图用于描述一个状态机(状态机图)
活动图强调了从活动到活动的控制流
状态图强调了从状态到状态的转换
事件(Event)
指的是在时间和空间上占有一定位置,并且对状态机来讲是有意义的那些事情。事件通常会引起状态的变迁,促使状态机从一种状态切换到另一种状态。 包含一下:
1 | 1) 入口事件(Entry):QEP use as Action |
转换(Transition)
指的是两个状态之间的一种关系,表明对象将在第一个状态中执行一定的动作,并将在某个事件发生同时某个特定条件满足时进入第二个状态。 例如LED灯由亮到灭或者由灭到亮就是一个Transition。转移的类型有自转移、内部转移、自动转移、复合转移。完整的格式是“事件(参数)[条件]/动作”。
1 | 自转移:源状态和目标状态相同,所包含的动作和事件 与 转移 完全相同。不改变对象状态,只导致对象状态的中断。 |
内部(internal)转移: 一般用来更改处于某个状态下的扩展状态或者header
外部转移(external),本地(local)转移区别:
在大多数情况下,外部转换和本地转换在功能上是等同的,除非转换发生在super and sub状态之间。如果目标状态是源状态的sub状态,本地转换不会导致退出和进入源状态。反之,如果目标状态是源状态的super状态,则local转换不会导致退出和进入目标状态。下面的图片用非常简单的超状态和子状态显示了本地转换和外部转换的区别。
动作(Action)
指的是状态机中可以执行的那些原子操作,所谓原子操作指的是它们在运行的过程中不能被其他消息所中断,必须一直执行下去。 一个 Action 一般就对应一个函数。动作的类型有入口动作、出口动作、调用动作、延迟动作、创建动作、销毁动作、返回动作、终止动作、发送动作、本地调用动作、例外动作、错误处理动作。
活动(Activity)
由一系列动作组成,非原子操作。如组合状态中的每一个子状态机图都对应于该状态内的正在进行的一个活动,存在状态的迁移导致活动被打断。活动图和状态图区别
上下文(Context)
动作针对对象,包含静态数据和指令;状态机针对对象业务逻辑,包括动态处理流程。上下文负责将静态的数据和指令传递给动态的流程,对象上下文和状态机上下文。
伪状态(Pseudo States)
伪状态是一种特殊类型的状态,它通常通过给状态赋予特殊含义(例如初始状态)来将更高级的逻辑引入状态机。然后,状态机可以通过执行 UML 状态机概念中可用的各种操作在内部对这些状态做出反应。
伪状态和守卫对比:
在很多情况下,我们可能执行一个相对昂贵的计算,以确定你想进入的目标状态。如果使用守卫这样做,我们最终可能会多次执行这个昂贵的操作。如果我们执行一个进入伪状态的动作,则可以通过一次完成所有的逻辑并设置一个扩展变量或向头添加一个字段来使它更有效率,然后守卫就变得微不足道了。
2 状态图
1 状态图的作用
描述一个特定对象的所有可能状态,以及由于各种事件的发生,而引起的状态间的转移。
2 状态图的组成
节点是状态:包括初始状态和终止状态,用圆角矩形表示
关系是转换(或转移):用状态之间包含一些文字描述的有向箭头线表示
3 状态
3.1 状态的几种类型
3.1.1 初态和终态
初态(Start state):显示状态图中状态机的执行的开始。一个状态机只能有一个初态,因为每一个执行都是从相同的地方开始的。如果一个状态机用多张图描述,则多张图用同一个初态。嵌套状态中(spring中称为region)可以使用新的初态。
终态(End State):表示一个最后的或者终端状态;终态的数目可以不确定;
3.1.2 中间状态
中间状态的组成
1)状态名(Name)
2)进入/退出动作(entry/exit action)
3) 内部转换(Internal Transition)
不导致状态改变的转换,不会执行entry和exit动作
语法格式:event 事件名/动作表达式
4)子状态(Substate)
嵌套在另外一个状态中的状态。
3.1.3 组合状态
1)含有子状态的状态被称为组合状态
1.1)顺序组合状态图
1.2) 并发组合状态图
注意:在UML2.0中已经废弃了同步状态
3.1.4 历史状态
历史状态是一种伪状态;可以存储退出组合状态时所处的子状态,则返回组合状态时可以直接回到相应的子状态。spring中的历史状态分两种两种类型:浅(只记住顶级状态)和深(记住子机器中的活动状态)
3.1.4 区域(Region)和其它
组合状态包含多个活动子状态时,使用区域做为容器来包含子状态。
键盘状态中:有左侧是主键,右侧是数字键 都是键盘的子状态然后区域就是其容器包含子状态。(一个区域一个子状态)
1 |
|
其它
正交状态(Orthogonal):包含两个或两个以上区域的组合状态。
并发状态(Parallel):当前有多个活动子状态的组合状态。定义同正交状态。
复合状态(Compound):当前只有一个活动子状态的组合状态。应该就是顺序子状态。
4 状态转换的五要素
- 源状态(Source State):转换激发之前对象所处的状态
- 目标状态(Target State) :转换完成后对象所处的状态
- 触发事件(Trigger Event) :引起转换发生的事件。(也称为转移条件 Transition Condition)
- 监护条件(Guard Condition) :方括号括起来的布尔表达式,用于决定是否激活转换
- 动作(Action) :转换激活时对象执行的操作。(不是必须的也可能只转移状态不执行动作)
- 转换(Transition) : 状态将变化为另一个状态
智能水壶的状态图
1 | 打开[有水]/烧水: |
信用卡状态图
1)事件的四种类型
信号事件:
- 对象之间通过发送信号和接收信号实现通信
- 信号是两个对象之间通信的媒介,它是一种异步机制
- 在计算机中,鼠标和键盘的操作均属于此类事件
- 对于一个信号而言,对象一般都有相应的事件处理器,如onMouseClick()等
调用事件:
- 调用某个对象的成员方法就是调用事件,它是一种同步的机制。例如:在烧水器的状态图中,turnOn就是一种调用事件,用来将开关置于“On”状态。
改变事件:
- 某个指定属性值为真时,事件得到触发
- 在对象生命周期内,一直在计算改变事件中的属性值。当属性值为真时,事件触发,计算停止信号是两个对象之间通信的媒介,它是一种异步机制。
- 例如:when(temperature>100)/alerm()
时间事件
- 当时间流逝到某个时刻,触发事件对对象起作用
- 它可以指定为绝对形式,也可以指定为相对形式。
其它类型:
延迟事件(Deferred event)
- 延迟到下一状态中处理的事件
- 是一种特殊的事件,它是指该事件不会触发状态的转换,当对象处于该状态时事件不会丢失,但会被延迟执行
- 例如,当E-mail程序中正在发送第一封邮件时,用户下达发送第二封邮件执令就会被延迟,但第一封邮件发送完成后,这封邮件就会被发送。这种事件就属于延迟事件
2) 转换类型
例子:
1 |
|
5 状态图应用
为对象生命周期建模:
- 主要描述对象能够响应的事件、对这些事件的响应以及过去对当前行为的影响
为反应型对象建模:
- 这个对象可能处于的稳定状态、从一个状态到另一个状态之间的转换所需的触发事件,以及每个状态改变时发生的动作
状态机图既可以用来表示一个业务领域的知识,也可以用来描述设计阶段对象的状态变迁
绘制状态机图的步骤
- 寻找主要的状态
- 确定状态之间的转换
- 细化状态内的活动与转换
- 用复合状态来展开细节
状态图(购物网站)
当从状态“结账”和“显示购物车”返回子状态“显示索引信息”时,将进入的是离开时的历史状态。
也就是说,转到购物或结账区之后,再回到“浏览目录”的页面时,其中的内容是不变的,仍保留原来的信息。
状态图(订单处理)
订单处理
办理发货之前需要检查商品,查看是否齐全。如果缺部分商品,则进入等待状态(直至商品齐全)
货品发出之前,任何时候都可以取消订单
状态图(航班预订1)
细化状态内的活动与转换
使用复合状态
电梯系统的状态图
1 | 电梯开始处于空闲状态(idle),当有人按下按钮要求使用电梯时(事件is required发生),电梯进入运行状态(run)。如果电梯的当前楼层比想要的楼层高时(监护条件[currentFloor>desiredFloor]成立),电梯进入下降状态(moving down);反之,如果电梯的当前楼层比想要的楼层低时(监护条件[currentFloor<desiredFloor]成立),电梯进入上升状态(moving up);如果电梯的当前楼层与想要的楼层相同时(监护条件[currentFloor=desiredFloor]成立),电梯门打开(door open)。在电梯上升或下降期间,每经过一个楼层就判断监护条件[currentFloor=desiredFloor]是否成立,若不成立,继续移动,若成立,就进入停止状态(stop),15秒后,电梯门自动打开(door open),2分钟后,电梯门自动关上(door close),如果有更多的电梯使用要求,进入运行状态(run),反之,则进入空闲状态(idle)。 |
带有复杂转换的状态图
6 有限状态机器
有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机(英语:finite-state automation,缩写:FSA),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。
变换器[编辑]
变换器使用动作基于给定输入和/或状态生成输出。它们用于控制应用。常分为两种类型:
Moore机
主条目:摩尔型有限状态机
只使用进入动作的FSM,就是说输出只依赖于状态。Moore模型的好处是行为的简单性。图1的例子展示了一个电梯门的Moore FSM。这个状态机识别两个命令:“command_open”和“command_close”触发状态变更。在状态“Opening”中的进入动作 (E:)开启电机开门,在状态“Closing”中的进入动作以反方向开启电机关门。状态“Opened”和“Closed”不进行任何动作。它们信号通知外部世界(比如其他状态机)情况:“门开着”或“门关着”。
摩尔型有限状态机(Moore机)
,输出只依赖于当前状态。即:
1 | 次态 = f(现态,输入),输出 = f(现态) |
Mealy机[编辑]
图4变换器FSM: Mealy模型例子
主条目:米利型有限状态机
只使用输入动作的FSM,就是说输出依赖于输入和状态。Mealy FSM的使用经常导致状态数目的简约。在图4中的例子展示了实现同上面Moore机同样行为的Mealy FSM(行为依赖于实现的FSM执行模型,比如对虚拟FSM可工作但对事件驱动FSM不行)。有两个输入动作(I:):“开启电机关门如果command_close下达”和“反向开启电机开门如果command_open下达”。
米利型有限状态机(Mealy机)
,输出依赖于当前状态和输入。即:
1 | 次态 = f(现态,输入),输出 = f(现态,输入) |
在实践中经常使用混合模型。
进一步可区分为确定型(DFA)和非确定型(NDFA、GNFA)自动机。在确定型自动机中,每个状态对每个可能输入只有精确的一个转移。在非确定型自动机中,给定状态对给定可能输入可以没有或有多于一个转移。这个区分在实践而非理论中更有用,因为存在算法把任何NDFA转换成等价的DFA,尽管这种转换一般会增加自动机的复杂性。
只有一个状态的FSM叫做组合FSM并只使用输入动作。这个概念在多个FSM要一起工作的情况下是有用的,这时把纯组合部分看作一种形式的FSM来适合设计工具可能是方便的。
3 活动图
1 基础概念
与状态图的区别
状态图:由某个对象的状态序列组成,以状态为中心。
活动图:由某个过程中若干对象的活动序列组成,以活动为中心。
两者图形表示也不同
组成元素
活动节点
- 起点和终点(即初态和终态)
- 中间活动节点
转换流程
- 转换
- 分支与合并
- 分叉与汇合
图形表示
节点(活动)
1 | 活动节点是活动图中最主要的元素之一,用来表示工作过程中的一个(或多个)工作步骤 |
动作状态:原子性的动作或操作的执行状态,不能被外部事件的转换中断
活动状态:非原子性的,可以分解成其他子活动或动作状态,可以从外部中断。可以在图标中给出入口动作和出口动作等信息
组合活动:一种内嵌活动图的状态,用于表示复杂的活动
关系(转换)
作用:当一个活动结束时,活动控制流马上转向下一个活动节点
表示方法:一条带箭头的直线
分支与合并(决策)
程序控制流的三种基本结构:顺序、分支、循环
分支
- 用于将一条转换路径分成多个部分,每一部分都有单独的监护条件和不同的结果
- 当动作流遇到分支时,会根据监护条件的真假来判定动作的流向
注意:**分支的每个路径的监护条件应该是互斥的**,因此只有一条路径的转换会被激发
合并
两个或者多个控制路径在此汇合的情况,表示从对应分支开始的条件行为的结束。
合并和分支都使用菱形表示,且常常成对使用。
省略表示分支与合并的菱形不会丢失任何信息。
分叉与汇合(同步)
分叉与汇合:
- 都用来表示**并发**执行的活动
- 分叉线和汇合线(同步线):都使用加粗的水平线或垂直线段表示
分叉:
- 一个进入转换,多个离去转换
- 表明系统从单一的过程变为过个并发的过程
汇合:
- 多个进入转换,一个离去转换
- 表示系统将结束多个并发过程,再次进入单一的过程
注意:当且仅当所有的并发分支都到达汇合点后,活动流程才能进入下一个活动节点
4 多种动态图的区别
状态机图与交互图的区别:
- 交互图不显示对象所有可能的动态行为,只显示特定交互(一个具体的用例)中对象的行为。
- 状态机图可以显示对象所有的动态行为。
状态图与活动图的区别:
- 状态图只建模一个对象的行为,活动图可以建模多个对象的活动
- 活动图中也允许建模特定活动中对象的某个状态
交互图:单用例,多对象
状态图:多用例,单对象
活动图:多用例,多对象
状态图: 侧重从行为的结果来描述,即一个一个状态
活动图: 侧重从行为的动作来描述,即一个一个活动
5 spring状态机中的状态类型
伪状态是一种特殊类型的状态,它通常通过给状态赋予特殊含义(例如初始状态)来将更高级的逻辑引入状态机。然后,状态机可以通过执行 UML 状态机概念中可用的各种操作在内部对这些状态做出反应。
Order Shipping
State Machine
:将状态、转移、事件、保护、动作整合到一起管理的模型。State
:一个有限的状态模型,应该是一个list集合,由事件驱动其发生修改。Initial State
:状态机启动的特殊状态。初始状态总是绑定到特定的状态机或子状态机。具有多个region的状态机可能具有多个初始状态。1
每一个状态机都需要初始伪态状态,无论你有一个简单的单级状态机还是一个由子机或区域组成的更复杂的状态机。初始状态定义了状态机启动时应该去的地方。没有它,一个状态机是病态的。
End State
:最终状态是一种特殊的状态,表示封闭区域已完成。如果封闭区域直接包含在状态机中,并且状态机中的所有其他region也都完成了,则表示整个状态机已完成。1
所述终止伪状态(其也被称为“结束状态”)指示特定状态机已到达其最终状态。实际上,这意味着状态机不再处理任何事件并且不会转换到任何其他状态。但是,在子机是区域的情况下,状态机可以从其最终状态重新启动。
History State
:一种允许状态机记住其最后活动状态的伪状态,以存储退出组合状态时所处的子状态,则返回组合状态时可以直接回到相应的子状态。存在两种类型的历史状态,浅层仅记住顶层状态,深层记录子机中的活动状态。1
2
3
4
5你可以使用History伪态来记忆最后的活动状态配置。在一个状态机退出后,你可以使用历史状态来恢复之前已知的配置。有两种类型的历史状态可用。SHALLOW(只记住状态机本身的活动状态)和DEEP(也记住嵌套状态)。
历史状态可以通过监听状态机事件在外部实现,但这很快会使逻辑变得非常困难,特别是当状态机包含复杂的嵌套结构时。让状态机本身来处理历史状态的记录,事情就简单多了。用户只需要创建一个过渡到历史状态,而状态机则处理所需的逻辑以回到其最后的已知记录状态。
在过渡终止于一个历史状态的情况下,当该状态以前没有被进入(换句话说,没有以前的历史记录)或者它已经达到了它的结束状态,过渡可以通过使用默认的历史机制,迫使状态机进入一个特定的子状态。这个过渡起源于历史状态,终止于包含历史状态的区域的一个特定顶点(默认历史状态)。这个过渡只有在其执行导致历史状态并且该状态之前从未被激活的情况下才被采取。否则,将执行进入该区域的正常历史条目。如果没有定义默认历史转换,则执行该区域的标准默认进入。Choice State
:允许基于事件标题或扩展状态变量进行转换选择的伪状态。(分支)1
您可以使用Choice 伪状态选择从此状态转换的动态条件分支。动态条件由守卫评估,以便选择一个分支。通常使用一个简单的 if/elseif/else 结构来确保选择一个分支。否则,状态机可能会陷入死锁,并且配置格式错误。
Fork State
:一种伪状态,可以控制进入某个子状态机。(分叉)
Join State
:一个伪状态,它可以从一个子状态机提供受控的退出。(汇合)
Extended State
:保存在状态机中的一组特殊的变量。(例如cd播放机中当前播放的cd,歌曲,以及歌曲的时间)Transition
:源状态和目标状态之间的关系,由事件驱动其转移。1
Transition建立源状态和目的状态之间的联系。可以是一个复杂Transition的一部分,Transition会使状态机从一个状态转换到另一个状态,代表状态机对一个特定事件的出现的完整的响应。
Event
:驱动状态发生迁移的事件,可以用枚举或字符串描述。Region
:区域是复合状态或状态机的正交部分。它包含状态和转换。1
2
3
4
5区域(也称为正交区域)通常被视为应用于状态的异或 (XOR) 操作。状态机方面的区域概念通常有点难以理解,但通过一个简单的例子,事情变得更简单了。
我们中的一些人有一个全尺寸键盘,左侧是主键,右侧是数字键。您可能已经注意到,双方确实有自己的状态,如果您按下“numlock”键(这只会改变数字键盘本身的行为),您就会看到这种状态。如果您没有全尺寸键盘,您可以购买外部 USB 数字键盘。鉴于键盘的左侧和右侧可以彼此独立存在,它们必须具有完全不同的状态,这意味着它们在不同的状态机上运行。在状态机方面,键盘的主要部分是一个区域,而数字键盘是另一个区域。
将两个不同的状态机作为完全独立的实体来处理会有点不方便,因为它们仍然以某种方式协同工作。这种独立性让正交区域在状态机中的单个状态内的多个同时状态中组合在一起。
Guard
:是一个基于扩展状态变量和事件参数值动态计算的布尔表达式。保护条件仅在评估为TRUE时启用操作或转换,并在评估为FALSE时将其禁用,从而影响状态机的行为。1
个布尔表达式,基于Extended State中的变量或者event参数的值动态的计算。当表达式被计算为true时,启用action或者transition,当表达式被计算为false时,禁用action或者transition,Guard条件通过上面的方式影响状态机的表现。
Action
:动作是在触发转换期间执行的活动行为。(action是触发transition时被执行的行为)Entry Point
: 一种允许受控进入子状态机的伪状态。Exit Point
: 一种允许受控制地离开子状态机的伪状态
其它状态
Choice
1
您可以使用Choice 伪状态选择从此状态转换的动态条件分支。动态条件由守卫评估,以便选择一个分支。通常使用一个简单的 if/elseif/else 结构来确保选择一个分支。否则,状态机可能会陷入死锁,并且配置格式错误。
Junction
1
Junction伪态在功能上与choice类似,因为两者都是用if/elseif/else结构实现的。唯一真正的区别是,Junction允许多个传入转换,而choice只允许一个。这样的区别在很大程度上是学术性的,但确实有一些区别,比如当一个状态机被设计成与一个真正的UI建模框架一起使用时。
参考
1 | https://blog.csdn.net/alien75/article/details/37870069 |
- 本文作者: 初心
- 本文链接: http://funzzz.fun/2021/06/29/spring-machine-01定义/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!