6.4.3 UML的模型元素
UML的模型元素主要包括三个方面,即基本构造块(Basic Building Blocks)、支配这些构造块放在一起的规则(Rules)和一些运用于整个UML的公共机制(Common Mechanisms)。其中,UML基本构造块包含事物(Things)、关系(Relationships)和图(Diagrams)三种类型。
1.事物
UML中将各种事物归纳为四类,即结构事物、行为事物、分组事物和注释事物。
1)结构事物
结构事物是UML模型的静态部分,主要用于描述概念元素或物理元素,包括类、接口(Interface)、主动类(Active Class)、用例(Use Case)、参与者(Actor)、协作(Collaboration)、构件(Component)、节点(Node)和制品(Artifact)。
(1)类(Class)。
类由三部分组成,即类名、属性和操作。UML中的类用矩形表示,如图6-5(a)所示,顶部区域显示类名,中间区域列出类的属性,底部区域列出类的操作。此外,绘制类元素时,可根据建模实际情况隐藏类的属性或操作部分。

图6-5 UML的结构事物
(2)接口。
接口描述了一个类或构件的一组外部可用的服务(操作)集。接口定义的是一组操作的描述,而不是操作的实现。一般把接口画成从实现它的类或构件引出的棒糖形,如图6-5(b)所示。在UML中,接口声明时还可使用关键字
interface
的类表示,如图6-5(c)所示。接口体现了使用与实现分离的原则。接口很少单独存在,而是依附于实现接口的类或构件。
(3)主动类。
主动类是其对象拥有一个或多个进程或线程的类。它是一种特殊的类,UML引入主动类的目的是在实际开发中需要一些类能够起到启动控制活动的作用。主动类的对象所表现的元素行为与其他元素的行为并发。在图形上,为了与普通类区分,UML 2.x中主动类用两侧加边框的矩形表示,所图6-5(d)所示。UML 1.x中主动类用外边框为粗线条的矩形表示。
(4)用例。
用例表示系统想要实现的行为,不关心这些行为是怎样实现的。在图形上,用例用一个仅包含其名字的实线椭圆表示,如图6-5(e)所示。
(5)参与者。
参与者也称为行动者或角色。参与者定义了一组与系统有信息交互关系的人、事、物,在图形上用一个简化的人形符号表示,如图6-5(f)所示。
(6)协作。
协作完成某个特定任务的一组类及其关联的集合,用于对用例的实现建模。在UML中,协作用虚线椭圆表示,如图6-5(g)所示。可根据需要决定在椭圆内部是否画出参与协作的角色结构分栏,在实际应用中,协作就是某个用例的实现。
(7)构件。
构件也称为组件,是系统中物理的、可替代的部件。它通常描述一些逻辑元素的物理包。在图形上,构件用一个带有小方框的矩形来示,如图6-5(h)所示。
(8)节点。
节点是系统在运行时存在的物理元素,代表一种计算资源,通常具有存储空间和执行能力,如一台服务器、打印机等。在UML中,节点用一个立方体表示,如图6-5(i)所示。
(9)制品。
制品又称为工件,是被软件开发过程所利用或通过软件开发过程所产生的一段物理信息说明,如外部文档或工作产物,或者由部署和系统操作产生。工件实例被部署到节点实例上,通过代表对源码信息或运行时信息的物理打包。在UML中,制品通过在制品名上标有关键字
artifact
的矩形表示,如图6-5(j)所示。
2)行为事物
行为事物是UML模型的动态部分,包括交互(Interaction)、状态机(State Machine)两种,它们通常与各种结构元素如类、协作等相关。
(1)交互。
交互由在特定的上、下文环境中共同完成一定任务的一组对象之间传递的消息组成。在UML中,交互的消息画成一条有向直线,并在上面标有操作名。交互涉及的元素包括消息、动作序列(由一个消息所引起的行为)和链(对象间的连接)。对象是类的实例,在使用时需要在其名字下边加下画线。在UML中,对象的表示分成有名对象和匿名对象。图6-6(a)描述了匿名Company对象和有名Person对象p之间的交互。图6-6(b)给出了消息的表示方法。
(2)状态机。
状态机描述了一个对象或一个交互在生存周期内响应事件所经历的状态序列。状态机涉及的元素包括状态、转换、事件活动等。其中,状态用圆角矩形来表示,如图6-6(c)所示。
(3)分组事物。
分组事物是UML模型的组织部分,它的作用是降低模型的复杂性。
包(Package)是把模型元素组织成组的机制,结构事物、行为事物甚至其他分组事物都可以放进包内。包不像构件(仅在运行时存在),它纯粹是概念上的(仅在开发时存在)。包的图形如图6-6(d)所示。
(4)注释事物。
注释事物是依附于一个元素或一组元素之上,对其进行约束或解释的简单符号。在UML中,主要的注释事物称为注释(Note),如图6-6(d)所示。

图6-6 行为事物、分组事物、注释事物
2.关系
UML中有4种关系:依赖(Dependency)、关联(Association)、泛化(Generalization)、实现(Realization)。这4种关系是UML模型中可以包含的基本关系,如图6-7所示。它们也有变体,例如,依赖的变体有细化、跟踪、包含和延伸。

图6-7 UML中的关系
(1)依赖。
依赖是两个事物间的语义关系,其中一个事物(独立事物)发生变化会影响另一个事物(依赖事物)的语义。它用一个虚线箭头表示。虚线箭头的方向从源事物指向目标事物,表示源事物依赖于目标事物。
(2)关联。
关联是一种结构关系,它描述了两个或多个类的实例之间存在语义上的联系。在UML中,关联关系使用一条直线表示。
关联关系中还有两个特殊的关系,即聚集(Aggregation)和组合(Composition),它们都表示两个类之间的“整体-部分”关系,差别在于聚集中的部分可以独立于整体存在,而组合中的整体销毁时部分也将不复存在。在UML中,使用带空心菱形的直线表示聚集,使用带实心菱形的直线表示组合,并且菱形都指向整体类。
(3)泛化。
泛化是一般(Generalization)类和特殊(Specialization)类之间的继承关系。泛化关系用带空心箭头的实线表示,箭头指向父元素。
(4)实现。
实现是规格说明和它的实现之间的关系,也是类之间的语义关系,通常实现关系会在以下两种情况出现:一种是在接口和实现它们的类或构件之间;另一种是在用例和实现它们的协作之间。在UML中,实现关系用一条带空心箭头的虚线表示,箭头指向提供规格说明的元素。
3.图
UML 1.x中定义了9种图,UML 2.x标准将其进行了扩充,增加了3种新的图,表6-1对这些图做了简要说明。
表6-1 UML 2.x的正式图

4.UML规则
UML的语法和语义规则,主要体现在以下几个方面。
(1)命名(Name):为事物、关系、图起名字。
(2)范围(Scope):使名字具有特定含义的语境。UML 2.x中指属性或操作的静态标记。
(3)可见性(Visibility):这些名字以何种方式让其他成分看见并使用。UML中定义了public、protected、private、package四种可见性,如表6-2所示。
(4)完整性(Integrity):事物以何种方式正确、持续地互相联系。
(5)执行(Execution):解释运行或模拟动态模型的含义。
表6-2 UML可见性规则

5.通用机制
UML具有四种通用机制(Common Mechanism),即规格说明(Specifications)、修饰(Adornments)、通用划分(Common Divisions)和扩展机制(Extensibility Mechanisms)。通用机制使得建模过程更容易掌握,模型更容易理解和扩充。
1)规格说明
UML不仅是一种图形语言,在它的图形表示法的每个部分后面还有一个规则说明,用于对构造块的语法和语义进行文字叙述。UML的图形表示法用于对系统进行可视化,规格说明用于说明系统细节。把图形和规格说明分离,可以进行增量式的建模。首先画图,然后对该模型进行规格说明,或者直接创建规格说明;也可以对一个已存在的系统工程进行逆向工程,然后再创建作为这些规格说明的投影图。目前,很多UML建模工具,如Rose、Enterprise Architect等已经将这些功能集成。
2)修饰
UML中的大多数元素都有唯一和直接的图形表示符号,这些图形符号对元素最重要的方面提供了可视化的表示。但很多元素又包含了一些更具体的细节。为了更好地表示这些细节,可以把各种图形修饰符添加到元素的基本符号上,为模型元素增加语义。例如:类名用斜体字表示它是抽象类,+表示可见性为public。
3)通用划分
UML遵循面向对象系统建模中的一些共同的划分方法。主要包括以下两方面。
(1)型—实例的划分。
该划分描述了一个通用描述符和单个元素项之间的对应关系。通用描述符称为型元素,它是元素的类目,含有类目名称和对内容的描述;单个元素项是类目的实例。一个型元素可以对应多个实例元素。典型的型—实例的划分就是类和对象。类是一种抽象,对象是类的一个具体实例;一个类可以产生多个对象,类定义了基本的属性和方法,每个对象具有不同的属性值。UML中采用与类相同的图形符号表示对象,但是对象名有下画线。类似的型—实例的划分还有用例和用例实例、节点和节点实例、构件和构件实例等。
(2)接口和实现的分离。
接口声明了一个合约,而实现表示对该合约的具体实施,它负责如实地实现接口的完整语义。在UML中可以对接口和它的实现进行建模。
4)扩展机制
UML提供了构造型(Stereotype)、标记值(Tagged Value)和约束(Constraint)三种扩展机制。
(1)构造型。
构造型又称为版型,它扩展了UML的词汇表,可用于创造新的构造块。该构造块必须从UML中已有的基本构造块上派生,解决特定问题。它只是在已有元素上增加新的语义,而不是增加新的文法结构,它能使UML具有更强大和灵活的表示能力。构造型可应用于所有类型的模型元素,如类、构件、节点、关系、包、操作等。UML预定义了一些版型,如接口是类的构造型,参与者是版型化的类,子系统是包的构造型等。用户也可以自定义构造型,如用版型
exception
说明类Overflow是一个专用于处理异常事件的类。
(2)标记值。
标记值是一个名称—值对,它代表UML定义信息以外的附加特性信息,通常用于存储项目管理信息,如元素作者、创建日期等。每个标记值用“tag=value”的方式显示,其中,tag是标记名,value是标记值。标记值可使用“{}”括起来直接放在UML元素中,也可和其他特性关键词一起放在一个注释符号中与元素相连。
(3)约束。
约束是用某种文本语言的陈述句表达模型元素的语义或限制,它使用“{}”括起来的字符串表示,一般放在相关元素旁边。约束内容可用自由文本表示,也可用对象约束语言(OCL)精确定义。