状态机图是一种行为图,它通过使用有限的状态转移展示了一个系统中一个模块的一些离散的行为,在UML2.4里面有两种状态机图:
- 行为状态机(behavioral state machine)
- 协议状态机(protocol state machine)
通常在状态机图中绘制以下节点和边: 行为状态, 行为转换, 协议状态, 协议转换,不同的伪状态。
您可以在这里找到一些状态机图示例::
- 作为状态机的水相图
- 银行自动柜员机
- Java线程状态和生命周期
- Java EJB -会话对象的生命周期
- 用户帐户状态机图示例
- 行为状态
行为状态机
行为状态机是行为的特殊化,用于通过有限的状态转换来指定设计系统的一部分的离散行为。在这种情况下使用的状态机形式主义是Harel状态图的基于对象的变体。
行为建模为状态节点图的遍历,该图与转换连接。一系列事件的调度会触发转换。在遍历期间,状态机还可以执行一些活动。
行为状态机可以由行为分类器(称为其上下文)拥有。上下文定义了为此状态机定义的信号和调用触发器,以及状态机活动中可用的属性和操作。状态机的信号触发器和调用触发器是根据该分类器的接收和操作来定义的。
状态机可以具有相关的 行为特征 (规范)并且是该行为特征的方法。在这种情况下,状态机指定此行为功能的行为。状态机的参数与行为特征的参数匹配,并提供用于访问状态机内的行为特征参数的手段。
状态机的事件池是根据行为上下文分类器的实例的事件池,或者是拥有行为特性的分类器,状态机是其方法。
行为特征的方法状态机 的上下文分类器必须是拥有行为特征的分类器。没有上下文分类器的状态机可以使用独立于分类器的接收或操作的触发器,即,仅基于(参数化)状态机的操作模板参数的信号触发器或调用触发器。
状态机与其上下文分类器或行为特征之间的关联没有特殊的符号.
状态机可以以缩写形式呈现在标记为状态机或stm的帧中。(请注意,无论出于什么原因,UML 2.4规范第15章中状态机帧的所有示例都没有指定这种帧类型。)框架的内容区域通常是状态机本身,但是通常它可以包含其他类型的UML图。
银行ATM的高级行为状态机
行为状态机是协议状态机的子类。
初始状态
Vertex被命名为元素,它是状态机图中节点的抽象。一般来说,它可以是任何数量转换的源或目的地。
状态是一个Vertex ,它模拟一些情况,在这种情况下,某些(通常是隐含的)不变条件成立。
行为状态机
行为状态机中的状态对某个(通常是隐含的)不变条件成立的情况进行建模。不变量可以表示静态情况,例如对象等待某个外部事件发生。然而,它也可以对动态条件进行建模,例如执行某些行为的过程(即,所考虑的模型元素在行为开始时进入状态,并且在行为完成时离开它)。
继承状态用虚线或灰色线条绘制。
UML定义了以下几种状态:
简单的状态
简单状态是一种没有子状态的状态,它没有区域,也没有子机器状态。
简单状态显示为一个圆角矩形,状态名称位于矩形内。
简单状态等待客户输入。
或者,状态可以将状态名称放在附加的名称选项卡中。“名称”选项卡是一个矩形,通常位于状态顶部的外侧。
简单状态可能有分区。该状态的分区是:
名称区将状态的(可选)名称保存为字符串。没有名字的状态称为匿名状态,它们都被视为不同(不同)的状态。如果使用了名称选项卡,则不应使用名称分隔符,反之亦然。建议不要在同一图表中多次使用具有相同名称的状态。
内部活动区包含元素处于状态时执行的内部操作或状态(do)活动(行为)列表。“活动”标签标识将在何种情况下调用活动表达式指定的行为。行为表达式可以使用所属实体范围内的任何属性和关联端。对于表达式为空的列表项,斜线分隔符是可选的。
有几个标签是为特殊目的保留的,不能用作事件名称。以下是保留的活动标签:
- 进入(进入状态时执行的行为)
- do(持续行为,只要元素处于状态就执行)
- 退出(退出状态时执行的行为)
简单状态,等待客户输入名称和内部活动分区。
内部转换部分包含内部转换的列表,其中每个项都具有触发器所描述的窗体。如果防护条件不同,每个状态的每个事件名称可能会出现多次。事件参数和保护条件是可选的。如果事件具有参数,则可以通过当前事件变量在表达式中使用这些参数。
复合状态
通常,复合状态定义为具有子状态(嵌套状态)的状态。子状态可以是顺序的(不相交的)或并发的(正交的)。UML 2.4将复合状态定义为包含一个或多个区域的状态。(注意,该区域被定义为复合状态或状态机的正交部分。)状态不允许同时具有区域和子机器。
简单复合状态只包含一个区域。
为客户服务的简单复合状态有两个子状态。
正交复合状态有多个区域。每个区域都有一组互斥的互不相交的子元素和一组转换。一个给定的状态只能用这两种方法中的一种来分解。
封闭在复合状态区域内的任何状态都称为该复合状态的子状态。当它不包含在任何其他状态中时,它被称为直接子状态;否则,它被称为间接子状态。
复合状态的每个区域可以有一个初始伪状态和一个最终状态。到封闭状态的转换表示每个区域中到初始伪状态的转换。新创建的对象采用其最顶层的默认转换,从每个区域的最顶层初始伪状态开始。
复合状态可以将状态名放在附加的名称选项卡中。“名称”选项卡是一个矩形,通常位于状态顶部的外侧。
复合状态可能有分区。状态分区是:
分解区域将状态的合成结构显示为一个包含区域、状态和转换的嵌套图。为了方便和美观,文本隔室可以在图形区域内水平收缩。
在某些情况下,隐藏复合状态的分解是很方便的。例如,可能有大量的状态嵌套在一个复合状态中,它们可能根本不适合于图表可用的图形空间。在这种情况下,复合状态可以用一个带有特殊“复合”图标的简单状态图形表示,通常在右下角。这个图标由两个水平放置和连接的状态组成,它是一个可选的视觉提示,表明该状态有一个未在这个特定图表中显示的分解。相反,复合状态的内容显示在单独的图表中。“隐藏”是一个图形方便的问题,在访问限制方面没有语义意义。
复合状态为隐藏分解的客户提供服务。
复合状态可以 在其外边界上或在该边界附近(内部或外部)具有一个或多个入口和出口点。
子状态
子状态指定插入子状态机的规范。包含子计算机状态的状态机称为包含状态机。在单个包含状态机的上下文中,同一状态机可能不止一次是子机。
子状态在语义上等价于复合状态。子状态机的区域是复合状态的区域。进入、退出和行为操作以及内部转换被定义为状态的一部分。子状态是一种分解机制,允许对常见行为及其重用进行分解。
名称区将状态的(可选)名称保存为字符串。引用的状态机的名称显示为状态名称后面的“:”字符串。
区域
区域在UML2.4中定义为复合状态或状态机的正交部分。区域包含状态和转换。
通过使用虚线将状态/状态机的图形区域平铺为区域来显示具有区域的复合状态或状态机。每个区域可以有一个可选的名称,并且包含嵌套的不相交状态以及它们之间的转换。整个状态的文本间隔通过实线与正交区域分隔开。
只有一个区域的复合状态机或状态机通过在图形区域中显示嵌套的状态图来显示。
为了指示继承的区域已扩展,关键字“extended”与该区域的名称关联。
伪状态
伪状态是一个抽象顶点,包含状态机图中不同类型的瞬时顶点。
伪状态通常用于将多个转换连接到更复杂的状态转换路径。例如,通过将一个进入fork伪状态的转换与一组退出fork伪状态的转换相结合,我们得到一个复合转换,该转换导致一组正交目标状态。
伪状态包括:
- 初始伪态
- 终止伪状态
- 入口点
- 出口点
- 选择
- 加入
- 分叉
- 连接点
- 浅历史状态
- 深历史状态
初始伪状态
初始伪状态表示默认顶点,该顶点是单一转换到复合状态默认状态的源。一个区域中最多可以有一个初始顶点。从初始顶点传出的转换可能有行为,但不是触发器或保护。
初始伪态显示为一个小的实心圆。
初始伪状态转换为等待用户输入状态
在分类器行为状态机的区域中,从初始伪状态的转换可能被标记为创建对象的触发事件;否则,它必须未标记。如果它是未标记的,则表示从封闭状态的任何过渡。
终止伪状态
终止伪状态意味着该状态机通过其上下文对象的执行被终止。状态机不退出任何状态,也不执行任何退出操作,除了那些与导致终止伪状态的转换相关的操作。输入终止伪状态相当于调用DestroyObjectAction。
终止伪状态显示为十字形。
转换以终止伪状态
入口点
入口点伪状态是状态机或复合状态的入口点。在状态机或复合状态的每个区域中,至多有一个到同一区域内顶点的转换。
入口点在状态机关系图或复合状态的边界上显示为一个小圆圈,其名称与之关联。
入口点用户入口
可选地,它可以放置在状态机关系图内,也可以放置在状态机关系图或复合状态的边界之外。
出口点
出口点伪状态是状态机或复合状态的出口点。在子计算机状态引用的复合状态或状态机的任何区域内输入退出点意味着退出此复合状态或子计算机状态,并触发将此退出点作为封闭子计算机或COM的状态机源的转换。位置状态。
出口点显示为一个小圆圈,在状态机关系图或复合状态的边界上有一个十字,其名称与之关联。
出口点用户出口
可选地,它可以放置在状态机关系图或复合状态中,也可以放置在状态机关系图或复合状态的边界之外。
或者,“括号”符号也可以用于面向转换的符号
选择
选择伪状态实现动态条件分支。它评估其传出转换的触发器的保护,以仅选择一个传出转换。选择哪条路径的决定可以是在同一运行到完成步骤中执行的先前操作的结果的函数。动态选择应区别于静态结点分支点。
选项伪状态显示为菱形符号。
根据条件选择传出转换。
如果多个监护条件为真,则选择任意一个。如果没有一个监护条件为真,那么模型被认为是不正确的。为了避免这种情况,请在适当的时候使用预定义的“其他”保护定义一个传出转换。
如果与离开选择伪状态的转换触发器相关联的所有保护都是共享公共左操作数的二进制表达式,则可以使用简化符号。左操作数放在菱形符号内,其余的保护表达式放在输出转换上。
基于对监护内部价值的保护选择
分叉
分叉伪状态顶点用于将传入转换拆分为两个或多个转换,终止于正交目标顶点(即复合状态的不同区域中的顶点)。从分叉顶点传出的段不能有防护或触发器。
分叉的符号是一个短而重的横杆。从条到状态,条可能有一个或多个箭头。可以在条形图附近显示转换字符串。
分叉将转换拆分为两个转换
加入
连接伪状态合并源自不同正交区域中源顶点的几个转换。进入连接顶点的过渡不能有防护或触发器。
连接的符号是一个短而重的小节。该条可以具有从源状态到该条的一个或多个箭头。可以在条形图附近显示转换字符串。
连接将转换合并为单个转换
连接
连接伪状态顶点是用于连接多个转换的顶点。它们用于构造状态之间的复合转换路径。例如,可以使用连接将多个传入转换聚合为表示共享转换路径的单个传出转换(这称为合并)。
相反,它们可用于将传入转换拆分为具有不同保护条件的多个传出转换段。这实现了一个静态条件分支。(在后一种情况下,禁用防护条件值为假的传出转换。
可以为最多一个传出转换定义一个表示“else”的预定义保护。如果标记其他转换的所有保护都为假,则启用此转换。)静态条件分支与通过选择顶点实现的动态条件分支不同。
一个交叉点由一个黑色的小圆圈表示。
源于一组状态的多个无触发和无效果转换,并以具有单个传出转换的连接顶点为目标,可以显示为状态符号,其中包含状态名称列表和与来自JU的传出转换相对应的传出转换符号。NCTION公司。
从具有作为目标的历史的连接处过渡的特殊情况可以选择性地作为状态列表状态符号的目标呈现。
浅历史伪状态
浅历史伪状态表示其包含状态的最新活动子状态(但不是该子状态的子状态)。复合状态最多可以有一个浅历史顶点。进入浅历史顶点的过渡相当于进入状态的最新活动子状态的过渡。最多有一个转换可能来自历史连接线到默认的浅历史状态。这种转换是在复合状态以前从未处于活动状态的情况下进行的。执行由浅历史表示的状态的进入动作。
浅层历史由一个包含“h”的小圆圈表示。它适用于直接包围它的状态区域。
深度历史假状态
深度历史伪状态表示直接包含该伪状态的复合状态的最新活动配置(例如,上次退出复合状态时活动的状态配置)。复合状态最多可以有一个深度历史顶点。最多可以从历史连接器向默认深度历史状态进行一次转换。这种转换是在复合状态以前从未激活的情况下进行的。执行从深层历史到由深层历史表示的最内部状态的隐式直接路径上输入的状态的输入动作。对于正在恢复的活动状态配置中的每个状态,条目操作仅执行一次。
一段深刻的历史由一个包含“H*”的小圆圈表示。它适用于直接包围它的状态区域。
最终状态
最终状态是表示封闭区域已完成的一种特殊状态。如果封闭区域直接包含在状态机中,并且状态机中的所有其他区域也已完成,则表示整个状态机已完成。注意,出于某种原因,UML2.4将最终状态定义为状态的子类,而不是伪状态。(初始状态为伪状态。)
最终状态显示为围绕一个小的实心填充圆的圆。
转换到最终状态。
行为转换
转换是源顶点和目标顶点之间的定向关系。它可以是复合转换的一部分,将状态机从一种状态配置转换为另一种状态配置,表示状态机对特定类型事件发生的完全响应。
行为转换的默认符号由以下BNF描述(略微修改并固定了来自UML 2.4规范的BNF版本):
transition ::= [ triggers ] [ guard ] [ '/' behavior-expression ]
triggers ::= trigger [ ',' trigger ]*
guard ::= '[' constraint ']'
可选的触发器列表指定可能引发状态转换的事件。如果事件与触发器关联的事件匹配,则该事件满足触发器。由于同一事件可以启用多个转换,因此它是触发转换的必要但不充分的条件。
guard约束是一个布尔表达式,根据触发事件的参数以及上下文对象的属性和链接编写。保护约束也可能涉及对当前状态机的正交状态的测试,或者明确指定某些可到达对象的状态(例如,“处于活动状态”)。
在带有保护的简单转换中,在触发转换之前对保护进行评估。在涉及多个保护的复合转换中,除非在一条或多条路径上有选择点,否则在触发转换之前评估所有保护。未定义评估防护的顺序。保护不应包括引起副作用的表达式。
当转换触发时,将执行行为表达式。它可以根据上下文对象的操作、属性和链接以及触发事件的参数,或者在其范围内可见的任何其他特性来编写。行为表达式可以是动作序列。
触发器和转换的后续效果可以根据上面的语法以文本方式表示,也可以在转换上使用图形符号。
源自复合状态的转换称为高级转换或组转换。如果被触发,它们将导致退出复合状态的所有子状态,执行其退出活动,从活动状态配置中最内部的状态开始。
复合转换表示由一个或多个转换组成的“语义完整”路径,源于一组状态(与伪状态相反),目标是一组状态。
内部转换在不退出或重新进入定义状态的情况下执行。即使状态机在此状态中处于嵌套状态,也是如此。
完成转换是从状态或退出点开始的转换,但它没有显式触发器,尽管它可能定义了一个保护。完成转换由完成事件隐式触发。
|