UML系列文章(25)高级行为---状态图

  • 对反应型对象建模
  • 正向工程和逆向工程

状态图是UML中对系统的动态方面建模的五种图之一。一个状态图显示了一个状态机。在为对象的生命期建模中,活动图和状态图都是有用的。然而,活动图展示跨过不同的对象从活动到活动的控制流,而状态图展示的是单个对象内从状态到状态的控制流。

状态图用于对系统的动态方面建模。大多数情况下,它涉及对反应型对象的行为建模。反应型对象是这样一种对象,它的行为是通过对来自其语境外部的事件作出反应来最佳刻画的。反应型对象具有清晰的生命期,其当前行为受其过去行为的影响。状态图可以被附加到类、用况或整个系统上,从而可视化、详述、构造和文档化一个单独的对象的动态特性。

状态图不仅对一个系统的动态方面建模有重要意义,而且对于通过正向工程和逆向工程来构造可执行的系统也很重要。

1. 入门

试着考虑一个投资者,他为一座新摩天大楼的建造提供资金。投资者未必对建造过程的细节感兴趣。材料的选择、贸易的计划和许许多多关于工程细节的会议,对建造者拉说是很重要的活动,但对提供项目资金的人来说却远没有那么重要。

投资者感兴趣的是对投资的良好回报,这也意味着保护投资免受风险。一个完全信任他人的投资者,会提供给建造者一笔资金,然后离开一段时间,仅当建造者准备交付大厦的钥匙时才返回。这样的投资者真正感兴趣的是这座大厦的最终状态。

较为务实的投资者仍是信任建造者的,但也想在交出钱之前证实该项目是正确运作的。

因此,审慎的投资者不是给建造者一大笔无人照管的钱去随便花,而是为这个项目设立明确的里程碑,每个里程碑对应着某些活动的完成,并且仅当完成之后,下一个阶段的项目资金才会交到建造者手中。例如,在项目开始时,可能提供适量资金进行建筑设计工作。当建造事宜被批准时,可能为项目提供较多的资金以进行设计工作。在这项工作做得使项目资金监管人员感到满意后,才能拨给更大量的资金。以便建造者破土动工。

    接下去,从破土动工到取得产权证书,这中间还会有其他的里程碑。每个这样的里程碑都命名了该工程的一个稳定的状态:结构设计完成、工程设计完成、破土动工、基础设施完成、大厦经盖章批准使用等。对于投资者来说,跟踪大厦状态的变化比跟踪活动流更为重要,这些活动流可能是建造者用波特图对项目的工作流建模所做的。

    对软件密集型系统建模一样,将发现可视化、详述、构造和文档化某些对象的行为的最自然方法是着眼于从状态到状态的控制流,而不是着眼于从活动到活动的控制流。可以用流程图(UML中使用活动图)来描述后者。想象一下,对一个嵌入式家庭安全系统的行为建模。这样的系统需要不间断地工作,并对来自外部的事件(如窗户被打破)做出反应。另外,事件的顺序会改变系统行为的方式。例如,如果系统是第一次报警,检测到窗户被打破将只是触发一个警报。描述这样一个系统的行为,可通过对它的稳定状态(如Idle、Armed、Active和Checking等)、触发从状态到状态变化的事件以及每个状态改变时发生的动作进行建模来做最好的说明。

    在UML中,用状态图对一个对象按事件排序的行为建模。如图所示,状态图是强调从状态到状态的控制流的状态机的简单表示。

2. 术语和概念

     状态图(state diagram)显示了一个状态机,它强调从状态到状态的控制流。状态机(state machine)是一个行为,它说明对象在它的生命期中响应事件所经历的状态序列以及它对那些事件的响应。状态(state)是对象的生命期中响应事件所经历的状态序列以及它对那些事件的响应。

状态(state)是对象的生命期中的一个条件或状况,在此期间,对象将满足某些条件、执行某些活动或等待某些事件。事件(event)是对一个有意义的发生的规约,这种发生在时间和空间上占有一定的位置。在状态机的语境中,事件是一次激励的出现,激励能够触发状态转移。转移(transmition)是两个状态之间的关系,它指明当特定事件发生而且特定条件满足时,在第一个状态中的对象执行一定的动作并进入第二个状态。活动(activity)是状态机中正在进行的执行。动作(action)是一个可执行的原子计算,它引起模型状态改变或值的返回。在图形上,状态图是顶点和弧的集合。

2.1 公共特性

    状态图只是一种特殊种类的图形,它拥有像所有其他图一样的公共特性,即一个名称,以及投影在一个模型上的图形内容。状态图与其他各种图的区别是它的内容·。

2.2 内容

    状态图通常包括:

  • 简单状态和组合状态
  • 转移、事件和动作

与所有其他图一样,状态图也可以包括注解和约束。

注解:状态图基本是状态机中的元素的投影。这意味着状态图可以包括分支、分岔、汇合、懂的工作状态、活动状态、对象、初始状态、终止状态和历史状态等。事实上,状态图可以包括状态机的任何和所有特征。

2.3 一般用法

    可以用状态图为系统的动态方面建模。这些动态方面可以包括出现在系统体系结构的任何视图中的任何一种对象的按事件排序的行为,这些对象包括类(含主动类)、接口、构件和结点。

    当使用状态图对系统的某些动态方面建模时,实际上可以在任何建模元素的语境中做这件事情。然而,通常将在整个系统、子系统或类的语境中使用状态图。也可以把状态图附加到用况(对脚本建模)上。

    对系统、类或用况的动态方面建模时,通常用状态图为反应式对象建模。

    反应型(或事件驱动的)对象是这样一种对象,其行为通常是由对来自其语境外部的事件所作出的反应来最佳刻画的。反应型对象在接受到一个事件之前通常处于空闲状态;当它接收到一个事件时,它的反应常常依赖以前的事件;在这个对象对事件做出反应后,它就又变成空闲状态,等待下一个事件。对于这种对象,将着眼于对象的稳定状态,触发从状态到状态转移的事件,以及当每个状态改变时所发生的动作。

3. 常用建模技术

3.1 对反应型对象建模

3.2 正向工程与逆向工程

从状态图到代码的转换:

一个正向工程工具可以把上图的类MessageParser生成Java代码如下,

 

 

 这里需要说明一点小技巧。正向工程必须生成所需的私有属性和最终的静态常量。

逆向工程,从代码产生模型,理论上说是可能的,但实际上并不实用。

4. 提示和技巧

    在用UML创建状态图时,要记住每个状态图只是系统的动态方面在同一模型上的一个投影。一个单独的状态图能捕捉单独一个反应型对象的语义,而没有任何一个状态图能捕捉整个复杂系统的语义。

    一个结构良好的状态图,应满足如下要求:

  • 关注与传达系统动态特性的一个方面。
  • 仅包含对于理解这个方面很重要的那些元素。
  • 提供与它的抽象层次相一致的细节信息。

当绘制一个状态图是,要遵循如下策略:

  •  为它取一个能表达其用途的名称。
  • 先为对象的稳定状态建模,然后对从状态到状态转移建模。
  • 摆放这些元素,尽量避免线段交叉。
  • 对于大型状态图,考虑详尽的UML规范中包含的诸如子状态机之类的高级特征。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值