
1.4.4 软件行为建模
图1-6所示的结构模型里面包含了十分丰富的细节,这些细节包括每个类的定义、类(或者对象)之间的关系,每个类的属性和方法等。所有这些细节并不可能仅仅在构思一张类图时就能够全部完整地得到,可能需要一个艰苦的过程。事实上,任何一个完整的结构模型都是经过对系统的各种行为进行较为充分的建模后再逐步完善后得到的。
UML中,常见的行为模型由用例图、活动图、状态图、时序图和通信图等多种模型组成,它们以不同的方式和角度描述系统的行为。其中用例图和活动图比较适合在需求分析阶段进行的行为建模时使用,从一个比较抽象的层面上进行用例建模。状态图用于描述一个对象在其生命周期内在接收到外部消息或外部事件时所做出的响应及其状态变化。时序图和通信图则重点关注软件在完成某项功能时需要的对象以及这些对象之间的交互。所有这些行为建模的结果就是不断丰富和充实现有的类模型,从而得到最终需要的完整的结构模型。
下面将以简单计算器Calculator类为例,设计这个类的对象的状态模型,并说明这个状态图的作用。我们将简单计算器对象的状态被定义成Initial、MustInputAnOperator和InputtingNumber三种状态。
它们的具体定义如下。
1)Initial:计算器的初始状态,此时计算器的当前字符为空字符,默认当前值为零。
2)MustInputAnOperator:表示计算接收的当前字符是个运算符,此时用户必须输入一个数字字符。
3)InputtingNumber:表示计算器接收的当前字符是一个数字字符,用户可以持续地输入数字字符;若用户输入了一个运算符,则保存当前输入数值,并结束当前输入状态,进入StartToInputNumber状态,当前数值为零,用户可以开始输入一个新的表达式。
图1-7给出了Calculate类对象的状态图。图中描述了Calculate类对象的状态及其状态的变迁。其中,Input(ch)是该对象的一个事件,ch是事件的内容,也可以称为一个信号。这张状态图不仅描述了状态及其变迁的情况,同时还概括性地描述了该对象完成一次计算的过程,读者可自行分析一下这个过程。

图1-7 Calculate对象的状态图
例如,计算器中的一次计算活动就是这样一个过程,图1-8中展示的顺序图就描述了一个由多个对象协作完成的表达式计算过程。

图1-8 表达式计算过程的顺序图
在面向对象系统中,大部分的功能都是由多个对象之间相互协作来完成的,在软件设计过程中,通过行为建模清晰地描述对象之间的交互将是十分必要的。
为了增加一些基本的感性认识,本节概括性地介绍了使用面向对象方法分析和设计软件的主要过程。在后面的章节中,将详细并系统地介绍这一主流的软件分析和设计方法。