面向对象分析强调的是对一个系统中对象的特征和行为的定义。
统一建模语言(UML
)是面向对象软件的标准化建模语言。
UML
的词汇表包含三种构造块:
- 事物,对模型中最具有代表性的成分的抽象。
- 关系,关系把事物结合在一起。
- 图,图聚集了相关的事物。
(一)事物
UML
中有四种事物:结构事物、行为事物、分组事物和注释事物。
1. 结构事物
通常是模型的静态部分,描述概念或物理元素。
结构事物包括:
- 类
- 接口
- 协作
- 用例
- 主动类
- 构件
- 制品
- 结点
各种结构事物的图形化表示如下图所示:
2. 行为事物
行为事物是UML
模型的动态部分,它们是模型中的动词,描述了跨越时间和空间的行为。
行为事物包括:
- 交互
- 状态机
- 活动
各种行为事物的图形表示如下图所示:
交互 由在特定语境中共同完成一定任务的一组对象之间交换的消息组成。一个对象群体的行为或单个操作的行为可以用一个交互来描述。交互涉及一些其他元素,包括消息、动作序列和链。
状态机 描述了一个对象或一个交互在生命期内响应事件所经历的状态序列。单个类或一组类之间协作的行为可以用状态机来描述。一个状态机涉及到一些其他元素,包括状态、转换、事件和活动。
活动 是描述计算机过程执行的步骤序列,注重步骤之间的流而不关心哪个对象执行哪个步骤。活动的一个步骤称为一个动作,在图形上,把动作画成一个圆角矩形,在其中含有指明其用途的名字。
3. 分组事物
分组事物是UML
模型的组织部分,是一些由模型分解成的“盒子”。
在所有的分组事物中,最主要的分组事物是包。包把元素组织成组的机制。结构事物、行为事物甚至其他分组事物都可以放在包中。
包的图形化表示如下图所示:
4. 注释事物
注释事物是UML
模型的解释部分。这些注释事物用来描述、说明和标注模型的任何元素。
注解是一种主要的解释事物。注解是一个依附于一个元素或一组元素之上,对它进行约束或解释的简单符号。
注解的图形化表示如下图所示:
(二)关系
UML
中有四种关系:
-
依赖
依赖是两个事物间的语义关系,其中一个事物发生变化会影响另一个事物的语义。
在图形上,把一个依赖画成一条可能有方向的虚线。如下图所示:
-
关联
关联是一种结构关系,它描述了一组链,链是对象之间的连接。
聚集是一种特殊类型的关联,它描述了整体和部分间的结构关系。
关联和聚集的图形化表示如下图所示:
-
泛化
泛化是一种特殊/一般关系,特殊元素(子元素)的对象可替代一般元素(父元素)的对象。
在图形上,把一个泛化关系画成一条带有空心箭头的实线,它指向父元素。如下图所示:
-
实现
实现是类元之间的语义关系,其中一个类元指定了由另一个类元保证执行的契约。
在两种情况下会使用实现关系:一种是在接口和实现它们的类或构件之间;另一种是在用例和实现它们的协作之间。
在图形上,把一个实现关系画成一条带有空心箭头的虚线,如下图所示:
(三)UML中的图
图是一组元素的图形表示,大多数情况下把图画成顶点(代表事物)和弧(代表关系)的连通图。
UML2.0
提供了13
种图,分别是:
- 类图
- 对象图
- 用例图
- 序列图
- 通信图
- 状态图
- 活动图
- 构件图
- 组合结构图
- 部署图
- 包图
- 交互概览图
- 计时图
其中,序列图、通信图、交互概览图和计时图均被称为交互图。
1. 类图
类图展现了类、接口、协作和它们之间的关系。如下图所示:
类图用于对系统的静态设计视图建模。
当对系统的静态设计视图建模时,通常以下述三种方式之一使用类图:
-
对系统的词汇建模
需要考虑:哪些抽象是考虑中的系统的一部分,哪些抽象处于系统边界之外。
用类图详细描述这些抽象和它们的职责。 -
对简单的协作建模
协作是一些共同工作的类、接口和其他元素的群体,该群体提供的一些合作行为强于所有这些元素的行为之和。
例如,当对分布式系统的事务语义建模时,不能仅仅盯着一个单独的类来推断要发生什么,而要有相互协作的一组类来实现这些语义。
用类图对这组类以及它们之间的关系进行可视化和详述。 -
对逻辑数据库模式建模
将模式看作为数据库的概念设计的蓝图,可以用类图对这些数据库的模式建模。
2. 对象图
对象图展现了某一时刻一组对象以及它们之间的关系,描述了类图中所建立的事物的实例的静态快照。
对象图一般包括对象和链。如下图所示:
对象图给出系统的静态设计视图或静态进程视图,这种视图主要支持系统的功能需求,即系统应该提供给最终用户的服务。利用对象图可以对静态数据结构建模,主要是对对象结构进行建模。
对象图表示了交互图表示的动态场景的一个静态画面,可以使用对象图可视化、详述、构造和文档化系统中存在的实例以及它们之间的相互关系。
3. 用例图
用例图展现了一组用例、参与者及它们之间的关系。
用例图通常包括:用例;参与者;用例之间的扩展关系和包含关系,参与者和用例之间的关联关系,用例与用例以及参与者与参与者之间的泛化关系。如下图所示:
用例图对系统的静态用例视图进行建模。这个视图主要支持系统的行为,即该系统在它的周边环境的语境中所提供的外部可见服务。
当对系统的静态用例视图建模时,可以用以下两种方式来使用用例图:
-
对系统的语境建模
对一个系统的语境进行建模,包括围绕整个系统画一条线,并声明有哪些参与者位于系统之外并与系统进行交互。在这里,用例图说明了参与者以及它们所扮演的角色的含义。 -
对系统的需求建模
对一个系统的需求进行建模,包括说明这个系统应该做什么,而不考虑系统应该怎样做。在这里,用例图说明了系统想要的行为。
4. 交互图
交互图用于对系统的动态方面进行建模。
交互图表现为序列图、通信图、交互概览图和计时图。
(1)序列图
序列图强调消息时间顺序的交互图。描述了以时间顺序组织的对象之间的交互活动。如下图所示:
形成序列图时,首先把参加交互的对象放在图的上方,沿水平方向排列。通常把发起交互的对象放在左边,下级对象依次放在右边。然后,把这些对象发送和接收的消息沿垂直方向按时间顺序从上到下放置。以此来形成控制流随时间推移的清晰的可视化轨迹。
序列图与通信图不同的两个特征:
- 序列图有对象生命线
对象生命线是一条垂直的虚线,表示一个对象在一段时间内存在。- 大部分对象存在于整个交互过程中,所以这些对象全部排列在图的顶部,其生命线从图的顶部画到图的底部。
- 少部分对象在交互过程中创建,它们的生命线从接收到构造型为
create
的消息时开始。 - 对象也可以在交互过程中撤销,它们的生命线在接收到构造型为
destroy
的消息时结束(并且给出一个大X
的标记表明生命的结束)。
- 序列图有控制焦点
控制焦点是一个瘦高的矩形,表示一个对象执行一个动作所经历的时间段,既可以是直接执行,也可以是通过下级过程执行。
矩形的顶部表示动作的开始,底部表示动作的结束。还可以通过将另一个控制焦点放在它的父控制焦点的右边来显示控制焦点的嵌套。
(2)通信图
通信图强调接收和发送消息的对象的结构组织。也被称为协作图。
产生一张通信图,首先要将参加交互的对象作为图的顶点,然后把连接这些对象的链表示为图的弧,最后用对象发送和接收的消息来修饰这些链。如下图所示:
通信图有两个不同于序列图的特性:
- 通信图有路径
为了指出一个对象如何与另一个对象链接,可以在链的末端附上一个路径构造型。通常只需要显式地表示以下几种链的路径:local(局部)
、parameter(参数)
、global(全局)
、self(自身)
。 - 通信图有顺序号
为了表示一个消息的时间顺序,可以给消息加一个数字前缀。如果有嵌套的话,可以使用带小数点的号码。
(3)交互概览图
交互概览图强调控制流。是UML2.0
新增的交互图之一,它是活动图的变体,描述业务过程中的控制流概览,软件过程中的详细逻辑概览,以及将多个图进行连接,抽象掉了消息和生命线。使用活动图的表示法,如下图所示:
(4)计时图
计时图是另一种新增的,特别适合实时和嵌入式系统建模的交互图,关注沿着线性时间轴、生命线内部和生命线之间的条件改变。它描述对象状态随着时间改变的情况,项示波器,适合分析周期和非周期性任务。如下图所示:
5. 状态图
状态图展现了一个状态机,它由状态、转换、事件和活动组成。强调对象行为的事件顺序。
状态图通常包括简单状态和组合状态、转换(事件和动作)。如下图所示:
状态是指对象的生命周期中某个条件或状态,在此期间对象将满足某些条件、执行某些活动或等待某些事件,是对象执行了一系列活动的结果,当某个事件发生后,对象的状态将发生变化。
6. 活动图
活动图是一种特殊的状态图,它展现了在系统内从一个活动到另一个活动的流程。如下图所示:
活动图一般包括活动状态和动作状态、转换和对象。
当对一个系统的动态方面建模时,通常有两种使用活动图的方式:
- 对工作流建模
关注的是与系统进行协作的参与者所观察到的活动。 - 对操作建模
此时是把活动图当作流程图使用,对一个计算的细节部分建模。
7. 构件图
构件图展现了一组构件之间的组织和依赖。构件图专注于系统的静态实现视图,与类图类似,通常把构件映射成一个或多个类、接口或协作。如下图所示:
8. 组合结构图
组合结构图用于描述一个分类器(如类、构件或用例)的内部结构,分类器与系统中其他组成部分之间的交互端口,展示一组相互协作的实例如何完成特定的任务,描述设计、架构模式或策略。组合结构图的内部结构和协作使用图分别如以下两图所示:
9. 部署图
部署图是用来对面向对象系统的物理方面建模的方法,展现了运行时处理结点以及其中构件(制品)的配置。
在部署图中,通常一个结点是一个在运行时存在并代表一项计算资源的物理元素,至少拥有一些内容,常常具有处理能力,包含一个或多个构件。如下图所示:
10. 包图
包图是用于把模型本身组织成层次结构的通用机制,不能执行,展现由模型本身分解而成的组织单元以及其间的依赖关系。
包可以拥有其他元素,可以是类、接口、构件、结点、协作、用例和图,甚至是嵌套的其他包。如下图所示: