3.5 状态图
状态图(Statechart Diagram)用于描述一个特定对象在其生命周期间基于事件反应的动态行为,显示该对象是如何根据当前所处状态对不同事件做出反应的。一个系统包括很多对象,通常只有对于一些具有复杂行为或处于不同状态对应不同处理的对象,才有必要用状态图描述它的状态转移过程,并不需要为每一个对象建立状态图。在UML中,对象的状态图包括一系列的状态、状态之间的转移及引起状态转移的事件。
3.5.1 状态
状态是对象执行了一系列活动的结果,所有对象都具有状态,当某个事件发生后,对象的状态将发生变化。在状态图中,对象的状态主要分为3种,如图3-19所示。
1)初态:是状态图的起始点,用实心圆表示,一个状态图只能有一个初态。
2)终态:是状态图的终点,用套有一个小实心圆的空心圆表示,一个状态图可以有多个终态,也可以没有终态。
3)中间态:是对象执行某个活动或等待某个事件时所处的具体形态,用3栏圆角矩形框表示,从上至下每一栏分别为状态名、状态变量和活动。状态变量是状态图所描述对象的属性,即对象处于该状态时其各属性的具体值。活动表示对象处于该状态时系统要执行的事件和动作,分为4种基本类型。
·entry事件:指定对象进入该状态时发生的动作。
·do事件:指定对象处于该状态时发生的动作。
·event事件:指定当特定事件产生时触发的动作。
·exit事件:指定对象退出该状态时发生的动作。
在状态图中描述中间态时通常只标明状态名和相应的活动列表,而活动可以包括4种事件(也可以只有其中几种)。图3-20描述了手机对象的通话状态。
图3-19 对象状态图标
图3-20 手机对象通话状态
3.5.2 状态转移
转移是两个状态之间的关系,表示当发生指定事件或满足指定条件时,对象执行某些操作并由一个状态进入另一个状态。外界产生的事件或状态内部活动的执行完毕都可触发状态转移,但通常状态转移大多是由事件触发的,且给定的状态只能产生一个转移。
状态转移用从源状态指向目标状态的实箭线表示,如图3-21所示,线条上方标明触发转移的事件,若未标明事件,则表示源状态内部活动执行完毕自动触发转移。图3-22是手机对象的状态转移图。
图3-21 状态转移
图3-22 手机对象状态转移图
3.5.3 事件
事件是触发状态转移的条件或操作,UML中定义了4种主要事件类型,如图3-23所示。
1)消息事件:由外界传递的简单信号或消息,对象收到后发生状态转移。消息事件的格式为:[消息或信号],图3-23a中触发电灯对象由照明状态转移至熄灭状态的“[断电]”信号即为消息事件。
2)调用事件:外界传递的要求对象调用执行某个操作并发生状态转移的请求。调用事件的格式为:事件名(参数列表),图3-23b中触发手机对象由空闲状态转移至拨号状态的“呼叫(xx)”请求即为调用事件。
3)时间事件:根据某时间表达式的满足情况决定对象状态转移的事件。时间事件的格式为:[时间表达式],图3-23c中电脑对象由运行状态转移至屏保状态的触发条件“[等待超过10分钟]”即为时间事件。
4)变化事件:根据某特定条件的满足情况决定对象状态转移的事件。变化事件的格式为:[when(条件表达式)],图3-23d中触发熔断器对象由通电状态转移至熔断状态的事件“[when(电流>xA)]”即为变化事件。
图3-23 事件类型
a)消息事件—电灯对象 b)调用事件—手机对象 c)时间事件—电脑对象 d)变化事件—保险丝事件
3.5.4 建立状态图的步骤
在系统分析与设计阶段,建立状态图的步骤如下。
1)选择初始状态和终结状态。
2)发现对象的各种中间状态。
3)确定状态间的转移及引起状态转移的事件。
4)在各中间态上添加必要的活动。
5)绘制状态图。
案例3-4
信用卡账户是银行系统中比较特殊的一类对象,其状态的变化伴随系统的一系列相应操作,故需要对信用卡账户对象绘制状态图,其具体过程如下。
1)发现对象各种状态。信用卡账户对象有“未开通”“正常”“透支”“冻结”“挂失”“注销”6种主要状态。
2)确定状态间的转移及引起状态转移的事件。信用卡账户各状态之间的转移情况为:
·初态可转移到未开通状态,当用户开卡时,账户由未开通状态转移到可正常使用状态。
·当用户取款至账户余额为负数时,账户状态由正常转为透支,此时促发状态转移的事件为取款,它要求账户对象除了状态转移外还要调用自身方法来更新账户余额,因此该事件为调用事件。
·当用户将透支的金额还清时,账户状态由透支转为正常,此时促发状态转移的事件为存款,它要求账户对象除了状态转移外还要更新账户余额,因此该事件也为调用事件。
·当账户透支金额大于5000时,账户状态由透支转移到冻结,促发状态转移的事件为变化事件;若用户及时将欠款还清,账户状态由冻结转移到正常,促发状态转移的事件为存款,它也是一个调用事件;若用户1年后还未还清欠款,账户会在冻结1年后自动注销,此时促发状态转移的事件为时间事件。
·当用户要求挂失时,账户由正常状态转移到挂失状态,当用户要求解挂时,账户由挂失状态转移到正常状态。
·当用户要求销户时,账户由正常状态转移到注销状态,同时账户对象会更新自身的相关信息,此时促发状态转移的事件销户为调用事件,处于注销状态的账户对象会终止状态转移。
3)根据上一步的分析,信用卡账户对象在刚进入透支、正常和注销状态时都要进行账户的编辑操作,因此为这3个状态都添加entry活动。
最后形成信用卡账户对象的状态图,如图3-24所示。
图3-24 “信用卡账户”对象状态图