UML — 一份全面指南
什么是UML?
UML是一种面向对象方法的标准表示法,由统一对象建模技术而创建。它用于系统的分析、设计和部署。统一建模语言旨在满足企业自动化软件生产、提高质量并降低成本和上市时间的需求。它还为理解建模语言提供了正式基础。

为什么使用UML?
大型企业应用必须以一种能够实现可扩展性、安全性,并在压力条件下稳健运行的方式进行结构设计。良好的架构设计能够实现代码复用,使维护人员能够在原始作者转投其他项目多年后仍能发现并修复出现的错误。建模对于大型软件项目至关重要,对中型和小型项目也同样有帮助。一个模型可确保业务功能完整且正确,满足用户需求,并且程序设计支持可扩展性、健壮性、安全性、可扩展性及其他特性。
- 模型通过隐藏或屏蔽细节、突出整体图景或聚焦于原型的不同方面,帮助我们以更高的抽象层次进行工作。
- UML 可用于建模任何类型的应用程序,运行在任何类型的硬件、操作系统、编程语言和网络上,也可用于建模非面向对象的应用程序。
- 一些工具分析现有的源代码(或据称的目代码!),并将其反向工程为一组UML 图,而另一些工具则执行UML模型,通常生成运行速度快的程序语言代码,前提是代码生成器采用了最佳实践的可扩展模式。
- 收集和分析应用程序需求并将其融入程序设计的过程十分复杂。UML 是一种语言,可帮助您表达分析和设计的结果。
它从何而来?
UML 的根源在于20世纪80年代末至90年代初开发的面向对象编程方法。吉姆·鲁姆鲍格、格雷迪·布鲁奇和伊瓦尔·雅各布森将他们的理念融合成统一方法,后来被称为统一建模语言(UML)。对象管理组(OMG)发布的首个提案请求(RFP)成为多家组织联合提交联合RFP响应的催化剂。RFP响应——UML 1.0——定义清晰、表达力强、功能强大且具有普遍适用性,随后逐步增强至1.1至1.5版本,并进一步发展为2001至2006年的UML 2.1(目前UML的最新版本是2.5)

UML 的优势
使用UML的最大好处是,即使程序员只理解程序的一小部分,也能轻松读懂图表中的代码。
- UML 是一种用于视觉描述程序的标准。它被广泛使用并被普遍接受为描述程序的通用语言。
- UML 图展示了计算机程序中类与实体之间的关系。通过查看图表,可以轻松理解程序的关系。
- UML 图以直观的方式帮助解释程序中的关系,并允许程序员复用已存在的代码部分,而无需重新编写这些功能。
- UML 是面向对象编程语言当前的标准。它有助于在编程开始前进行程序规划,并生成代码基于模型中建立的类生成代码。
UML 图与模型——结构与行为
UML 图展示了系统组件如何与其他组件交互以及系统将如何运行。UML 模型是系统模型的完整图形表示,而图则是部分表示。

静态视图与动态视图
静态建模使用对象、属性、操作和关系来展示系统的结构,而动态建模则通过对象之间的协作以及对象内部状态的变化来展示系统的运行行为。
- 结构图表示软件系统的静态方面。它们用于记录软件系统的软件架构。
- 行为图描述系统的动态方面。它们用于描述软件系统的功能。
UML 图的 14 种类型
UML 2.2 包含 14 种图其中 7 种表示结构信息,7 种表示交互的一般方面。

结构图
由于结构图表示结构,因此在记录软件系统的软件架构方面被广泛使用。结构图描绘了系统中各个元素的静态结构。七个 UML 结构图大致围绕建模系统时会遇到的主要事物类别进行组织。
例如,组件图描述了软件系统如何被划分为组件,并展示了这些组件之间的依赖关系。
| 结构图 | 简要说明 |
| 组合结构图 | 它展示了分类器的内部结构、分类器通过端口与环境的交互,或协作的行为。 |
| 部署图 | 它展示了一组节点及其关系,以说明架构的静态部署视图。 |
| 包图 | 它将相关的 UML 元素分组为一组逻辑相关的 UML 结构。 |
| 配置文件图 | |
| 类图 | 它展示了类、接口和协作及其关系,通常在面向对象系统建模中出现。 |
| 对象图 | 它展示了对象及其关系,是类图中所列事物实例的静态快照。 |
| 组件图 | 它展示了组件及其关系,以说明系统的静态实现视图。 |
行为图
UML 的五种行为图用于建模系统的行为。它们展示了数据如何在系统中流动,对象之间如何通信,时间的流逝如何影响系统,以及哪些事件会导致系统内部状态发生变化。
| 行为图 | 简要说明 |
| 活动图 | 它是一种图形化表示逐步活动和操作的工作流程,支持选择、迭代和并发 |
| 用例图 | 它通过用例描述系统的功能需求,使您能够将对系统的需求与系统如何满足这些需求联系起来。 |
| 状态机图 | 它通过有限状态转换展示设计系统中某一部分的离散行为。 |
| 顺序图 | 它展示了为实现场景功能而需要交互的对象之间的消息传递顺序。 |
| 通信图 | 它通过自由布局的顺序消息,展示对象和/或部分(以生命线表示)之间的交互。 |
| 交互概览图 | 它通过可包含其他元素的节点描绘控制流交互图. |
| 时序图 | 当图表的主要目的是通过关注线性时间轴上生命线内部及之间的条件变化来推理时间时,它展示了交互。 |
1. 类图
一个类图它描绘了应用程序的静态视图,有助于构建可执行的软件代码。它展示了属性、类、函数和关系,以提供软件系统的整体概览。它们用于构建应用程序的静态视图。对象模型图可以通过在编码前提供应用程序的总体示意图来减少维护时间。
根据系统的复杂程度,您可以使用一个类图来建模整个系统,也可以使用多个类图来建模系统的各个组件。类图是面向对象建模过程的基础,用于描述系统的静态结构。在分析阶段,类图可以帮助您理解问题领域的需要,并识别其组成部分。
该类图类图是面向对象建模的主要构建模块。它通过展示类、它们的属性、操作以及对象之间的关系来显示面向对象系统的结构。顶部部分包含类的名称,中间部分包含其属性,底部部分包含其操作。
关系通常写在关联线的中间。它们通常带有小箭头,以表示阅读关系的方向。关系中对象的多重性可以表示为:恰好一个、零个、一个、多个、一个或多个。

- 类是对象的蓝图,面向对象设计的重点不在于对象,而在于类,因为我们使用类来创建对象。
- 选择视角取决于您在开发过程中的进展程度。分析模型结合了概念性和规范性视角。
- UML类关系用于传达如何从图表中实现代码。如果被精确解读,实现的代码将准确反映设计者的意图。
- 关联由连接两个类的线表示。在每一端,我们可以标明所有权、该端元素所扮演的角色以及实例的多重性。
- 泛化是两个类之间的关系。特定类的每个实例也是通用类的间接实例。
- 聚合是一种关联类型,表示部分-整体或部分-整体关系。它可以通过在包含类上使用空心菱形形状,并用一条线连接到被包含类来图形化表示。
- 当一个类的对象使用另一个类的对象时,就存在依赖关系。
- 抽象类用于在类之间查找功能,其名称以斜体书写。
2. 对象图
对象是类在运行时特定时刻的实例,对象图显示系统在某一时刻的详细状态。它们用于展示数据结构的示例,而类图用于验证对象图.

(使用 Visual Paradigm (桌面版) 的对象图工具)
- 对象图显示系统中对象之间的关系,可用于解释复杂的系统类图。
- 在UML中,对象图显示模型中分类器的实例及其关系。您可以通过实例化类图、部署图、组件图和用例图中的模型元素来创建对象图。
- 要开发一个对象图,您必须识别构成系统的机制,然后识别参与该机制的类、接口及其他元素,并确定这些事物之间的关系。
- 对象图可用于展示对象在某一特定时刻的状态。
3. 组件图
一个组件图用于将大型面向对象系统分解为更小的组件。它可视化系统中各组件之间的关系及其组织结构。组件图是软件系统逻辑组件及其关系的表示,是系统的一种静态实现视图。通常用于可视化组件、构建可执行文件,并描述组件的组织结构和相互关系。


- 该组件图展示了组件提供的和所需接口。
- 组件是系统的一个模块化部分。它被绘制为一个矩形,可选的分隔区垂直堆叠。
- 使用棒棒糖或插座来表示组件到接口的依赖关系,使用半圆来表示组件到所需接口的依赖关系。
4. 部署图
部署图显示运行时系统的结构以及软件将部署到的不同硬件项目之间的通信路径。部署图是由顶点和弧组成的集合,用于展示系统中节点之间的关系。它对系统工程师控制性能、可扩展性、可维护性和可移植性非常有用。

部署图将系统架构展示为软件构件部署到部署目标的过程。它们可以是规范级别(也称为类型级别)或实例级别(类似于类图和对象图)。
部署图与组件图
- 部署图用于描述用于在系统中部署软件组件的硬件组件。
- 组件图用于描述系统的软件构件,而部署图用于描述系统的硬件拓扑结构。
5. 包图
包用于将语义相关的元素分组,以组织复杂系统的高层系统元素。A 包图 是一种对元素进行分组并定义其相互依赖关系的模式。它们将模型元素和组件划分为一致的单元或系统。这些图简化了系统访问控制、模型导航、配置管理以及其他语义方面的考虑。

- 包使用文件夹符号表示,模型则在右上角使用三角形表示。
- 包图遵循嵌套包的层次结构,例如,包图还可以将用例分组为逻辑相关的子系统。
- 如果包A中的任何类依赖于包B中的任何类,或者两个类之间存在客户端-服务器关系,则两个包之间存在依赖关系。
- 包图 允许我们指定包之间的依赖关系。依赖关系通过虚线箭头表示。
- 包导入关系被解释为将目标包中的元素导入到源包中。
- 包合并是两个包之间的有向关系。它将目标包的特性添加到源包的特性中。
- 包是其他模型元素的容器。包可以进行层次嵌套,且容器可以被删除或复制,而不会删除其所包含的元素。
6. 组合结构图
在UML模型中,一个组合结构图 通过使用部件、端口和连接器来描绘结构化分类器的内部结构

(使用 Visual Paradigm (桌面版) 的组合结构图工具)
-
部件:表示包含的结构化分类器所拥有的一个或多个实例的图示元素
- 连接器将端口连接在一起,协作将实例连接在一起,结构化分类器表示可以通过部件之间交互来描述的类,而封装的分类器包含端口。
-
端口:定义分类器实例与其环境之间,或分类器行为与其内部部件之间的交互点
- 接口:可以建模为类,但不会被实例化。具体类必须实现该接口,外部实体可以使用接口而无需关心内部实现。
-
协作:使用协作用例来仅定义完成协作特定目标所需的职责和连接
类 vs 对象 vs 组合结构图
- 类图展示构成复杂结构的类之间的关系,而对象图展示该结构的具体实例。
- 组合结构图展示组件之间的交互方式。
7. 配置文件图
UML是一种通用的建模语言。然而,在某些情况下,针对特定领域优化的语言更具优势。配置图 允许为特定领域和平台自定义UML模型。这些图通过构造型、标记值定义和约束来定义。


A UML配置 可以通过三种方式创建:创建新的元模型、扩展现有元模型或使用语言内建机制。
- 构造型允许您通过创建外观原始且符合您领域语言的新构建块来扩展UML的词汇量。
- 标记值用于向UML模型元素添加信息。它们可用于代码生成、版本控制、配置管理、作者信息等。
- 约束允许您通过添加新协议来扩展UML构建块的语义。它们以括号包围的字符串形式呈现,并放置在相关元素附近。
行为图
UML行为图用于可视化、指定、构建和记录系统的动态方面。行为图可分为以下几类:用例图、交互图、状态图和活动图。
1. 用例图
一个用例图 是软件程序行为的视觉表示。它通过指定外部可见的系统行为,帮助设计师向用户传达系统的行为。用例仅表示系统的功能需求。业务规则、服务质量要求和实现约束必须单独表示。用例图用于描述系统中个体的角色。它们可用于规划需求、验证硬件设计、测试软件产品或创建在线帮助参考。
用例建模由伊瓦尔·雅各布森于1986年提出。1992年,他的著作《面向对象的软件工程》帮助推广了这一技术。用例图是系统的一个高层次视图。在不需要详细信息时,以较粗粒度编写用例是有益的。用例图通常在开发早期阶段创建,以捕捉需求、验证架构并驱动实现。

- 用例图应从参与者角度进行结构化,关注“做什么”而非“如何做”。
- 扩展关系用于将扩展用例中的可选行为包含到被扩展用例中。
- 一般化关系连接两个用例。子用例可以添加或覆盖父用例的行为。
- 系统的参与者是使用、安装、启动、维护、关闭系统以及从系统获取信息或向系统提供信息的人。
2. 活动图
活动图用于描绘系统中的控制流,并描述用例执行过程中涉及的步骤。活动图是工作流的图形化表示,支持选择、迭代和并发。它们还可以包含显示活动之间数据流的元素。活动图类似于流程图,用于描绘系统的动态方面。例如,活动图可用于展示从初始状态到最终状态的控制流。
活动图也用于建模业务流程和工作流。它们用于捕捉系统的动态行为,并用于建模面向对象或分布式系统的流程。

- 活动图用于建模系统中的一系列动作或控制流。
- 菱形表示具有多个分支的决策。分支应使用条件进行标注。
- 分叉节点将单一的输入流拆分为多个并发流。
- 合并节点将多个并发流重新合并。
- 引脚用于简化杂乱的活动图。它们表示动作的一个输入或输出。
- 信号用于修改系统中的活动。在活动被修改之前,需要响应。
- 泳道用于在活动图中对动作进行分组。
3. 顺序图
顺序图是一种简单的图表,用于展示系统各部分(即子系统或对象)之间的交互。UML顺序图通过使用垂直轴表示时间,来展示对象在时间上的交互。顺序图记录系统与用户之间或系统之间的交互。顺序图展示了操作是如何执行的。时间随着页面向下推进而流逝。
在顺序图中,消息表示对象之间的交互。调用消息表示对操作的调用请求,返回消息表示从接收者到调用者的数据流,递归消息表示对调用者的调用。

- 顺序图可用于模拟系统不同部分如何交互以完成单一用例,例如,顺序图有助于可视化类之间的交互,并在新系统中发现职责。
- 在顺序图中,一个对象向另一个对象发送消息。在消息交换过程中,两个对象都处于活动状态。
- 消息箭头用于顺序图中表示消息。消息箭头附带一个描述,称为消息签名。
- 当消息调用者不等待消息处理时,会发送异步消息。
4. 状态机图
状态机图(又称状态图、状态转换图)用于描述系统中组件的不同状态。它由外部或内部事件控制。用于建模系统的动态特性。它描述了从一个状态到另一个状态的控制流,用于建模对象从创建到终止的整个生命周期。例如,状态图展示了类中对象的所有可能行为以及事件的顺序,对于理解系统至关重要。
在大多数系统中,复杂性源于不同类的对象之间的交互,因此并非每个类都需要状态图。然而,对于复杂类,如过程控制或通信系统,需要状态图来建模对象的行为。


- 用一个实心黑圆圈表示系统或类的初始状态。
- 用实线箭头表示从一个状态到另一个状态的转换
- 用圆角矩形表示一个状态。
- 状态之间的转换由事件触发。
- 保护条件可阻止某些转换发生,而内部转换不会影响状态转换。
- 状态图包括初始状态、中间状态、转换和最终状态。它还包括一个圆角矩形框、名称、状态变量以及每个状态中执行的操作。
什么是状态?
状态是对象生命周期中的一个条件或情况,而事件是可能触发状态转换的刺激。保护条件是对布尔表达式的评估,一个转换可能具有多个保护条件。状态图常用于描述电子元件的行为。状态图可以包含将状态拆分为多个状态、合并状态、历史状态和复合状态。
活动图与状态图
- 在UML中,活动图表示高层次的活动。特别是,活动图可以表示并发和协调。
- 在状态机图中,顶点表示对象的状态,边表示事件的发生。附加的符号用于捕捉活动是如何协调的。
5. 通信图
通信图展示对象之间的交互方式。它们还展示对象之间传递的消息。建模用于实现用例和操作功能的对象间消息传递,并记录显示传递消息的交互。在通信图中,对象(用例中的参与者)用矩形表示,对象之间传递的消息用带标签的箭头表示,箭头从发送对象开始,指向接收对象。由于消息带有编号,因此易于阅读。

(由 Visual Paradigm 的通信图工具)
- UML通信图展示了系统或软件中对象之间消息的发送和接收方式。
- 线条表示链接,箭头表示消息。
- 消息按顺序编号,并用数字和小数点来描述。
通信图与顺序图
通信图和顺序图相似,它们展示相同的信息,但通信图按空间排列,而顺序图按时间排列。
例如,它通常将活动图和顺序图结合起来,描绘实体之间交换的消息,以实现系统中的某些特定任务。
- 顺序图显示消息的时间顺序,以及
- 通信图显示对象之间的关系。
6. 交互概览图
交互概览图类似于活动图,但每个单独的活动都以一个框架表示,该框架可以包含嵌套的交互图。UML交互概览图提供了交互模型的高层次抽象。它们还可以展示图与图之间的活动流程。换句话说,交互图通过描述消息的时间顺序以及发送和接收消息的对象的结构组织,来展示系统的动态行为。

(由 Visual Paradigm 的交互概览图工具)
交互概览图类似于活动图,但每个单独的活动都以一个框架表示,该框架可以包含嵌套的交互图。UML交互概览图提供了交互模型的高层次抽象。它们还可以展示图与图之间的活动流程。换句话说,交互图通过描述消息的时间序列以及发送和接收消息的对象的结构组织,来展示系统的动态行为。
交互概览图包含代表交互图的节点。例如,一个交互出现(或引用顺序图)允许您在顺序图中引用另一个顺序图。此功能使您能够将复杂场景分解为可重复使用的较小场景。每个场景都称为一个“交互”。
7. 时序图
时序图是交互图的一部分,它沿着线性时间轴描绘生命线内部及之间的条件变化。它展示了对象在一定时间段内的交互方式,显示了每个步骤所需的时间,并可用于发现改进之处。

(由 Visual Paradigm(桌面版)的时序图编辑器)
- 时序图沿线性时间轴展示交互,包含消息、生命线、时间轴、对象或角色等元素。
- 生命线表示交互中的一个独立参与者。它可以放置在图框或泳道内。
- 持续时间约束用于判断某个约束是否在一段时间内满足。
- 时间约束是一种表示时间区间的区间约束。违反时间约束意味着系统已失败。













