UML状态机图

UML状态机图是描述系统行为的常用技能。从20世纪60年代开始,各种状态图形式相继出现,最早的面向对象技术采纳了状态图来展示行为。在面向对象方法中,为单个类画状态机图来展示单个对象的生命期行为。

无论何时,人们写到关于状态机的东西时,例子必然是巡航控制或售货机。我对它们有点厌烦了,所以我决定使用哥特城堡中一块秘密面板的控制器来做例子。我想把我的贵重物品放进这个城堡的一个保险箱中藏起来。因此,为了把锁露出来,我必须把蜡烛从烛台移开,但只有门关闭时才能开锁。一旦我可以看到锁,就可以插入我的钥匙打开保险箱。为了确保安全,我确保只有首先替换蜡烛才能打开保险箱。如果小偷忽略这个预警,我就放出一个丑恶的妖怪吞掉他。

下图展示了指挥我那独特的安全系统的控制器类的状态机图。状态图从控制器对象被创建时的状态开始,就是下图中的Wait状态。这张图用初始伪状态(initial pseudostate)指出这一点,初始伪状态不是状态,但它有一个箭头指向初始状态。

下图展示了控制器可以有3个状态:Wait(等待)、Lock(上锁)和Open(打开)。图上也给出了控制器从一个状态到另一个状态的改变所遵从的规则。这些规则以转换的形式存在:连接状态的线。

UML状态机图

转换transition)表示从一个状态到另一个状态的转移。每个转换都有一个标签,标签有3个部分:trigger-signature [guard]/activity(触发器-签名[警戒条件]/活动)。所有部分都是可选的。trigger-signature通常是触发状态潜在改变的单个事件。guard,如果有的话,是对要执行的转换来说必须为真的布尔条件。activity是一些在转换期间要执行的行为。它可以是任何行为表达式。trigger-signature的完整形式可能包括多个事件和参数。因此在图中,你可以把从Wait状态向外的转换阅读为“在Wait状态,如果蜡烛被移走时门是关闭的,把锁露出来并转换到Lock状态”。

转换的所有3个部分都是可选的。如果没有活动部分,说明在转换期间你不做任何事情。如果没有警戒条件部分,说明事件发生时你总是执行该转换。没有触发器-签名部分的情况很少,但确实也有,这种情况说明你要立即执行该转换,这就是最常见到的活动状态,稍后我将讨论这一点。

当事件在某个状态发生时,你可以只执行一个向外的转换。因此如果你在同一事件上使用多个转换,就像图中的Lock状态,警戒条件必须互斥。如果一个事件发生,没有生效的转换——例如,Wait状态上的safe-closed(保险箱关闭)事件或者带门打开条件的candle-removed(蜡烛移除)事件——该事件被忽略。

终止状态说明状态机是完整的,暗含着控制器对象的删除。这样,如果某人粗心大意,掉进了我的陷阱,控制器对象会终止,因此我需要“把兔子放进笼子,打扫战场”,并重启系统。

记住,状态机只能够展示对象直接观察或激活的东西。因此,虽然你可能期望我在打开保险箱时添加或拿走东西,但我没有把它放在状态图上,因为控制器不能辨别。

当开发人员谈论对象时,他们经常引用对象的状态,状态意味着对象的字段中所有数据的结合。然而,状态机图中的状态是更加抽象的状态概念;本质上,不同的状态意味着对事件的不同反应方式。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!