概述
创建 UML 状态图的目的是研究类、角色、子系统或组件的实时行为。状态图不仅可用于描述用户接口、设备控制器和其他具有反馈的子系统,还可用于描述在生命期中跨越多个不同性质阶段的被动对象的行为,在每一阶段该对象都有自己特殊的行为。
一、状态图的基本模型
状态图是系统分析的一种常用工具,它通过建立类对象的生存周期模型来描述对象随时间变化的动态行为。状态图是展示状态与状态转换的图。通常一个状态机依附于一个类,并且描述一个类的实例。状态图包含了一个类的对象在其生命周期间所有状态的序列及对象对接收到的事件所产生的反应。
状态图主要用于表现从一个状态到另一个状态的控制流,它由表示状态的节点和表示状态之间转换的带箭头的直线组成。若干个状态由一条或多条转换箭头连接,状态的转换由事件触发。模型元素的行为可以由状态图中的一条通路表示,沿着此通路状态机随之执行一系列动作。一个简单的状态图如图 5-1 所示。
二、状态的表示法
状态由一个带圆角的矩形表示,状态图的图标可以分为2部分:名称和内部动作。
其中:
- 名称表示状态的名字,通常用字符串表示,一个状态的名称在状态图所在的上下文中应该是唯一的。
- 内部动作用于表示进入或者走出此状态应该执行的动作,它们将响应对象所接收到的事件但是不改变对象的状态。状态共包括如下4种动作类型。
- entry动作:表示进入该状态时执行的动作,采用“entry/动作名称”格式,如图5-2所
示。 - exit 动作:表示退出该状态时执行的动作,采用“exit/动作名称”格式,如图5-3 所示do动作:表示该状态下执行某一动作,采用“exit/动作名称”格式,如图5-4所示。
- on动作:表示该状态发生某事件时所执行的动作,采用“on事件名称(事件参数)执行条件]/动作名称”格式,如图5-5 所示。
- entry动作:表示进入该状态时执行的动作,采用“entry/动作名称”格式,如图5-2所
一个状态可以包含多个内部动作,这种内部状态又称为内部转换,即有一个源状态但没有目标状态,它转换后的状态仍是它本身。内部转换用于对不改变状态的插入动作建立模型,例如建立帮助信息。如图5-6所示,其中包含了3个内部动作。
三、转换的表示法
转换表示当一个特定事件发生或某些条件得到满足时,一个源状态下的对象在完成一定的动作后将发生状态转变,转向另一个称为目标状态的状态。
一个转换一般包括5部分的信息:源状态、目标状态、触发事件、监护条件和动作。
- 触发事件是能引起状态转换的事件。触发事件可以是信号、调用和时间段等。
- 监护条件是触发转换必须满足的条件,它是一个布尔表达式。当事件被触发时,监护条件被赋值。如果布尔表达式为真,那么转换被触发;否则不会引起转换。监护条件只能在触发事件发生时被赋值一次。从一个状态引出的多个转换可以有同样的触发器事件,但是每个转换必须具有不同的监护条件。
- 动作是一组可执行语句或计算处理的过程。动作可以包括发送消息给另一个对象、操作调用、设置返回值、创建和销毁对象等。动作是原子的,不可中断的。整个系统可以在同一时间执行多个动作。动作在它的控制线程中是原子性的,一旦开始执行就必须执行到底并且不能与同时处于活动状态的动作发生交互作用。
转换用带箭头的直线表示,分别连接源状态和目标状态。当源状态接收到一个事件,并且监护条件得到满足时,则执行相应的动作,同时从源状态转换到目标状态。如果转换上没有标注触发转换的事件,则表示此转换为自动进行。
转换如图 5-7所示,箭头中的说明格式包含了各种不同的描述信息。
转换通常分为外部转换、内部转换、完成转换和复合转换4种。
- 外部转换是一种改变对象状态的转换,它是最常见的一种转换。外部转换用从源状态到目标状态的箭头表示。
- 内部转换为状态内部的事件动作,它不离开该状态本身,在一定的条件下发生一定的动作,但发生后状态不发生转换。
- 完成转换又称为自转换,之所以称为完成转换是因为没有标明触发器事件的转换是由状态中活动的完成引起的,是自然而然完成的转换。
- 复合转换由简单转换组成,这些简单转换通过分支判定、分叉或接合组合在一起。多条件的分支判定又分为链式和非链式的分支。
四、初始状态的表示法
初始状态代表状态图的起始位置,起始状态在一个状态图中只允许有一个,用一个实心圆表示并在右侧显示初始状态名。
五、终止状态的表示法
终止状态是一个状态图的终止点,它用一个含有实心圆的空心圆表示,并在右侧显示初始状态名。
六、子状态的表示法
简单状态是没有子结构的状态。具有子状态(嵌套状态)的状态被称为复合状态。子状态可能被嵌套到任意级别。嵌套的状态图最多可能有一个初始状态和一个终止状态。通过显示某些状态只能在特定环境(包含状态)中存在,子状态可以化复杂的平面状态图。
如图 5-11所示的取款状态图中包含了3个子状态,每一个子状态的处理都可能导致退出该状态。
七、历史状态的表示法
除非另有指定,当转移进入复合状态时,嵌套状态机的操作将从初始状态开始重新执行(除非转移直接以子状态为目标)。历史状态使状态机可以重新进入在它退出复合状态之前的最后一个活动子状态。
如图 5-12所示,在验证账户失败后会让用户重新输入密码,输出密码后不需要重新进入取款状态,可以直接进入取款的历史状态继续验证账户,如图中的“H”所示。