
1.2 UML的组成
至此,我们已经对UML的发展过程有了一定了解,并且认识了UML体系结构中每层的作用。除了上述了解的UML基本概述外,还需要了解一下UML的组成。
UML的组成包括事物、关系和图。其中,事物是UML中的重要组成部分,关系具有联系元素的作用,而图则是很多有相互关系的事物的组。
1.2.1 事物
UML中包括构件事物、行为事物、分组事物和注释事物。
1.构件事物
构件事物是UML模型的静态部分、描述概念或物理元素,主要包括类、接口、协作、用例、组件、节点和活动类。
□ 类
类是对具有相同属性、方法、关系和语义的一组对象的抽象。一个类可以实现一个或多个接口。UML中类的符号如下图所示。

□ 接口
接口是为类或组件提供特定服务的一组操作的集合。一个接口可以实现类或组件的全部动作,也可以实现其中的一部分。UML中的接口符号如下图所示。

□ 协作
协作定义了交互操作。一个给定的类可能是几个协作的组成部分,这些协作代表构成系统模式的实现。协作在UML中使用虚线构成的椭圆表示,如下图所示。

□ 用例
用例描述系统中特定参与者执行的一系列动作。模型中的用例通常用来组织动作事物,它是通过协作来实现的。UML中使用实线椭圆表示用例,如下图所示。

□ 组件
组件是实现了一个接口集合的物理上可替换的系统部分。UML中组件的表示如下图所示。

□ 节点
节点是运行时存在的一个物理元素,代表一个可计算的资源,通常占用一些内存,具有处理能力。UML中节点的表示法如下图所示。

□ 活动类
活动类是类对象有一个或多个进程或线程的类,与普通的类相似,只是该类对象代表元素的行为和其他元素同时存在。UML中活动类的表示法和类相同,只是边框使用粗线条,如下图所示。

2.行为事物
行为事物又称动作事物,是UML模型中的动态部分,代表时间和空间上的动作。交互和状态机是UML模型中两个基本的动态事物元素,它们通常和其他结构元素、主要的类、对象连接在一起。
□ 交互
交互是一组对象在特定上下文中,为达到某种特定目的而进行一系列消息交换组成的动作。交互中组成动作对象的每个操作都要详细列出,包括消息、动作次序和连接等。UML中使用带箭头的直线表示,并在直线上对消息进行标注,如下图所示。

□ 状态机
状态机由一系列对象的状态组成。在UML中,状态机的表示法如下图所示。

3.分组事物
分组事物是UML模型中重要的组成部分。分组事物使用的机制称为包。包可以将彼此相关的元素进行分组。结构事物、动作事物,甚至其他分组事物都可以放在一个包中。包只存在于开发阶段。UML中包的表示法如下图所示。

4.注释事物
注释事物是UML中模型元素的解释部分。在UML中,注释事物由统一的图形表示,如下图所示。

1.2.2 关系
UML中,关系共分为5种,分别是关联关系、依赖关系、泛化关系、实现关系和聚合关系。这里对它们进行简要介绍,并讲解每种关系的图形表示。
1.关联关系
关联关系体现了两个类之间,或者类与接口之间的一种依赖关系,表现为一个类似属性的形式包含对另一个类的一个或多个对象的应用。关联的两端中以关联双方的角色和多重性标记,如下图所示。

2.依赖关系
依赖关系描述一个元素对另一个元素的依附。依赖关系使用带有箭头的虚线从源模型指向目标模型,如下图所示。

3.泛化关系
泛化关系也称为继承关系,这种关系意味着一个元素是另一个元素的特例。泛化关系使用带有空心三角箭头的直线作为其图形表示,箭头从表示特殊性事物的模型元素指向表示一般性事物的模型元素,如下图所示。

4.实现关系
实现关系描述一个元素实现另一个元素。实现关系使用一条带有空心三角箭头的虚线作为其图形表示,箭头从源模型指向目标模型,表示源模型元素实现目标模型元素。实现关系表示法如下图所示。

5.聚合关系
聚合关系描述元素之间部分与整体的关系,即表示一个整体的模型元素可由几个表示部分的模型元素构成。聚合关系使用带有空心菱形的直线表示,其中菱形连接表示整体的模型元素,而其他端则连接表示部分的模型元素。聚合关系表示法如下图所示。

1.2.3 图
每种UML的视图都是由一个或多个图组成的,图就是系统架构在某个侧面的表示。所有的图一起组成系统的完整视图。UML 2.0提供了13种不同的图,通过它们的相互组合提供了建模系统中的所有视图。UML中的13种图可以归纳为下列5种类型图。
□ 静态图 包含类图、对象图、包图、组合结构图。
□ 动态图 状态图、活动图。
□ 用例图 用例图。
□ 交互图 顺序图、通信图、时序图、交互概览图。
□ 实现图 组件图、部署图。
从应用的角度来看,当采用面向对象技术设计系统时,第一步是描述需求,第二步是根据需求建立系统的静态模型图,第三步是描述系统的行为。其中,第一步和第二步需要建立的模型为静态模型,包括用例图、类图、包图、对象图、组合结构图、组件图和部署图等;而第三步需要建立的模型为执行模型,包含状态图、活动图、顺序图、通信图、时序图和交互概览图等图形。
1.用例图
用例图(Use Case Diagram)显示多个外部参与者以及他们与系统提供的用例之间的连接。用例是系统中的一个可以描述参与者与系统之间交互作用的功能单元。用例图仅仅描述系统参与者从外部观察到的系统功能,并不描述这些功能在系统内部的具体实现。如下图中的用例图,展示了一组用例、参与者及其之间的关系。

2.类图
类图(Class Diagram)以类为中心,图中的其他元素或属于某个类,或与类相关联。在类图中,类可以有多种方式相互连接:关联、依赖、特殊化,这些连接称为类之间的关系。所有的关系连同每个类内部结构都在类图中显示。

3.对象图
对象图(Object Diagram)是类图的变体,使用与类图相似的符号描述。不同之处在于,对象图显示的是类的多个对象实例,而非实际的类。可以说,对象图是类图的一个实例,用于显示系统执行时的一个可能,即在某一时刻上系统显现的样子。
4.状态图
状态图(State Diagram)是对类描述的补充,用于显示类的对象可能具备的所有状态,以及引起状态改变的事件。状态之间的变化称为转移,状态图由对象的各个状态和连接这些状态的转移组成。事件的发生会触发状态的转移,导致对象从一种状态转化到另一种状态。
实际建模时,并不需要为所有的类绘制状态图,仅对那些具有多个明确状态并且这些状态会影响和改变其行为的类才绘制状态图。

5.顺序图
顺序图(Sequence Diagram)显示多个对象之间的动态协作,重点是显示对象之间发送消息的时间顺序。顺序图也显示对象之间的交互,就是在系统执行时,某个指定时间点将发生的事情。顺序图的一个用途是用来表示用例中的行为顺序,当执行一个用例行为时,顺序图中的每个消息对应了一个类操作或状态机中引起转移的触发事件。

6.活动图
活动图(Activity Diagram)用于描述执行算法的工作流程中涉及的活动。动作状态代表一个活动,即一个工作流步骤或一个操作的执行。活动图由多个动作组成,当一个动作完成后,动作将会改变,转移到一个新的动作。这样,控制就在这些互相连接的动作之间流动。

7.通信图
通信图是顺序图之外另一个表示交互的方法。与顺序图一样,通信图也展示对象之间的交互关系。和顺序图描述随着时间交互的各种消息不同,通信图侧重于描述哪些对象之间有消息传递,而不像顺序图那样侧重于在某种特定的情形下对象之间传递消息的时序性。也就是说,顺序图强调的是交互的时间顺序,而通信图强调的是交互的情况和参与交互的对象的整体组织。

通信图作为表示对象间相关作用的图形表示,也可以有层次结构。可以把多个对象作为一个抽象对象,通过分解,用下层通信图表示出多个对象间的协作关系,这样可缓解问题的复杂度。
8.组件图
组件图(Component Diagram)用代码组件来显示代码物理结构,一般用于实际的编程中。组件可以是源代码组件、二进制组件或可执行组件。组件中包含它所实现的一个或多个逻辑类的相关信息。组件图中显示组件之间的依赖关系,并可以很容易地分析出某个组件的变化将会对其他组件产生什么样的影响。

9.部署图
部署图(Deployment Diagram)用于显示系统的硬件和软件物理结构,不仅可以显示实际的计算机和节点,还可以显示它们之间的连接和连接类型。

10.包图
包图用于展现模型要素的基本组织单元,以及这些组织单元之间的依赖关系。包图是维护和控制系统总体结构的重要建模工具。对复杂系统进行建模时,经常需要处理大量的类、接口、组件、节点等元素,这时有必要对它们进行分组。把语义相近并倾向于同一变化的元素组织起来加入同一个包中,以便理解和处理整个模型。

11.组合结构图
组合结构图(Composite Structure Diagram)是UML 2.0中新增最有价值的新视图,也称为组成结构图,主要用于描述内部结构、端口和协作等。
在组合结构图中出现了“端口”和“协议”这两个新的概念,其中“端口”是类的一种性质,用于确定该类与外部环境之间的一个交互点,也可以确定该类与其内部各组件之间的交互点;而“协议”则是基于UML中的“协作”概念衍生而成的,主要描述参与结合的多个元素(角色)的一种结构,以及各自完成特定的功能,并通过协作提供某些新功能。
12.时序图
时序图是顺序图的另一种表现形式。时序图显示系统内各对象处于某种特定状态的时间,以及触发这些状态发生变化的消息。构造一个时序图最好的方法是从顺序图中提取信息,然后按照时序图的构成原则,相应添加时序图的各构成部件。

13.交互概览图
交互概览图具有类似活动图的外观,因此也可以按活动图的方式来理解。
交互概览图的外观与活动图类似,只是将活动图中的动作元素改为交互概览图中的交互关系。如果概览图内的一个交互涉及时间,则使用时间图;如果概览图中的另一个交互可能需要关注消息次序,则可以使用顺序图。交互概览图将系统内单独的交互结合起来,并针对每个特定交互使用最合理的表示法,以显示出它们如何协同工作,来实现系统的主要功能。