引言
统一建模语言(UML)是一种标准化的可视化建模语言,用于分析、设计、文档化和沟通软件系统的结构与行为。它提供了一套通用的符号和绘图技术,帮助开发人员、架构师、业务分析师、项目经理及其他利益相关者理解系统的工作原理。
UML不是一种编程语言。相反,它充当软件的可视化蓝图。团队可以使用UML 图表来描述需求、规划系统架构、建模业务流程、记录现有应用程序,并解释系统的不同部分如何交互。
例如,一个电子商务应用程序可能包含用户、产品、购物车、订单、支付服务和配送服务。UML 图表可以表示这些元素,展示它们之间的关系,并说明当客户下单时会发生什么。

UML 由对象管理组织(OMG)作为行业标准进行管理,同时也已通过国际标准被采纳。现代 UML 通常指 UML 2.x,它定义了一整套广泛的结构性与行为性图表。例如,UML 2.2 定义了 14 种图表类型,其中结构建模与行为建模各占一半。
什么是 UML?
UML是一种用于软件密集型系统的通用建模语言。它提供了一套标准化的表示法,用于表示:
-
系统组件
-
类与对象
-
用户需求
-
工作流与业务流程
-
对象之间交换的消息
-
系统状态与转换
-
软件部署环境
-
包与组件之间的依赖关系
UML 的目的并非替代源代码。相反,它帮助团队在实施前、实施中和实施后思考并沟通系统。
UML 模型可以在不同详细程度上创建:
-
概念层:描述主要业务概念,不包含实现细节。
-
分析层:探索需求、职责和系统行为。
-
设计层:定义类、接口、组件和交互。
-
实现层:表示与源代码和部署基础设施紧密对应的细节。
为什么 UML 很重要?
UML非常有用,因为当软件系统仅通过源代码或冗长的书面文档来描述时,可能会变得难以理解。
简化复杂系统
图表提供了大型系统的可视化概览。例如,类图可以比数页文字更清晰地展示数十个类及其关系。
改善沟通
开发人员、设计师、架构师、测试人员、业务分析师和客户可能具有不同的技术背景。UML 为他们提供了一种共享的视觉语言,用于讨论系统需求和设计决策。
支持规划
团队可以在编写代码之前对工作流、类、服务和部署环境进行建模。这可以在早期阶段暴露缺失的需求、重复的职责以及架构问题。
有助于软件文档化
UML 图可作为长期技术文档。它们帮助新开发人员理解现有系统,并在需要变更时协助维护团队。
促进更优的设计
创建模型会促使团队思考诸如以下问题:
-
哪个对象负责某项任务?
-
组件之间如何连接?
-
当操作失败时会发生什么?
-
哪些类相互依赖?
-
系统如何响应不同的事件?
UML 核心概念

类
类是定义一组对象共享属性和操作的蓝图。
例如,一个订单类可能包含:
-
属性:
orderId,orderDate,以及状态 -
操作:
calculateTotal()和cancelOrder()
对象
对象是类的实际实例。如果 订单 是一个类, order1001 可能是从该类创建的一个特定对象。
属性
属性表示由类或对象持有的数据。
示例包括:
-
名称 -
价格 -
emailAddress -
orderStatus
操作
操作表示类提供的行为。操作通常在编程语言中实现为方法。
示例包括:
-
addItem() -
submitPayment() -
sendNotification()
参与者
参与者是与系统交互的外部角色。参与者可以是人、另一个系统或外部设备。
示例包括:
-
客户
-
管理员
-
支付网关
-
仓储系统
接口
接口定义了一组类或组件承诺提供的操作。接口有助于减少依赖关系并支持可互换的实现。
关系
关系描述了 UML 元素之间的连接方式。常见关系包括关联、依赖、泛化、聚合和组合。
多重性
多重性指定了有多少对象可以参与一个关系。
常见示例包括:
-
1: 恰好一个 -
0..1: 零或一 -
*: 多 -
1..*: 一或多 -
0..*: 零或多
例如,一位客户可能下零个或许多个订单。这可以表示为:
客户 1 -------- 0..* 订单
UML 图分类
UML 图通常分为两大类:
-
结构图
-
行为图
结构图描述系统由什么组成。行为图描述系统做什么以及它随时间如何行为。

UML 结构图
结构图表示系统的静态组织。它们关注类、对象、组件、包、节点和关系。
1. 类图

类图是最广泛使用的 UML 图之一。它通过展示以下方式来表示系统的静态结构:
-
类
-
属性
-
操作
-
接口
-
关系
-
可见性
-
多重性
一个简化的电子商务类模型可能如下所示:
客户
- customerId
- name
+ placeOrder()
订单
- orderId
- orderDate
- status
+ calculateTotal()
产品
- productId
- name
- price
+ updatePrice()
可能的关系包括:
客户 1 -------- 0..* 订单
订单 1 -------- 1..* 产品
在更详细的设计中,一个订单项类可能会被引入到订单和产品.
类图可用于:
-
领域建模
-
面向对象设计
-
数据库与应用程序规划
-
识别职责
-
解释继承与接口
类图描述一般性的类,而对象图展示这些类的具体实例。Visual Paradigm 将类图描述为面向对象系统中类、属性、操作及关系的模型。
2. 对象图
对象图展示系统在某一时刻的快照。它表示实际的对象实例,而非一般性的类。

例如:
customerA:Customer
name = "Alex"
order1001:Order
status = "Paid"
当您需要展示以下内容时,对象图非常有用:
-
对象在运行时的状态
-
示例数据关系
-
特定场景
-
类实例之间的连接方式
类图可能显示一个客户可以下多个订单。而对象图则可以显示:customerA 当前拥有 order1001 和 order1002.
3. 组件图

组件图展示了可替换软件组件的组织结构和依赖关系。
电子商务组件图可能包括:
-
Web 应用程序
-
订单服务
-
产品服务
-
支付服务
-
通知服务
-
数据库
示例:
Web 应用程序 --> 订单服务
订单服务 --> 支付服务
订单服务 --> 通知服务
订单服务 --> 订单数据库
组件图特别适用于:
-
微服务架构
-
面向服务的系统
-
API 设计
-
应用程序架构
-
展示服务边界和依赖关系
4. 部署图

部署图表示软件执行的物理或虚拟环境。
它可能显示:
-
客户端设备
-
Web 服务器
-
应用服务器
-
数据库服务器
-
云节点
-
容器
-
网络连接
-
已部署的软件制品
示例:
客户设备
|
v
Web 服务器
|
v
应用服务器
|
v
数据库服务器
部署图有助于架构师理解软件运行位置以及基础设施组件之间的通信方式。
5. 包图

包图将相关的模型元素组织成包,并显示这些包之间的依赖关系。
一个项目可能包含如下包:
-
用户 -
目录 -
订单 -
支付 -
通知
示例:
order --> user
order --> catalog
order --> payment
payment --> notification
包图可用于:
-
组织大型模型
-
展示模块依赖关系
-
识别架构层次
-
防止不必要的耦合
6. 组合结构图

组合结构图显示类、组件或其他结构化分类器的内部结构。
它可以显示:
-
内部部件
-
端口
-
连接器
-
内部协作
-
内部元素之间的关系
例如,一个OrderController可能包含或连接到:
-
OrderService -
OrderRepository -
支付服务 -
通知服务
与通常关注高层组件的组件图不同,组合结构图关注分类器的内部组织。
7. 配置文件图
配置文件图扩展了 UML 以适用于特定领域或技术。它通过构造型、标记值和约束来定义专门的建模元素。

例如,配置文件可能引入如下构造型:
<<实体>>
<<控制器>>
<<服务>>
<<微服务>>
当需要为标准 UML 符号进行适配时,配置文件图非常有用,例如:
-
Web 应用程序
-
企业架构
-
实时系统
-
嵌入式系统
-
特定编程框架
-
行业特定建模
配置文件图常被省略在入门列表中,但它属于标准 UML 2.x 图类型之一。UML 2.x 通常被描述为包含七种结构图类型和七种行为图类型。
行为 UML 图
行为图描述系统的动态行为。它们展示工作流、事件、交互、状态变化和响应。
1. 用例图

用例图从外部参与者的角度展示系统的功能需求。
典型的在线购物系统可能包含以下参与者:
-
客户
-
管理员
-
支付网关
-
配送服务
可能的用例包括:
-
注册账户
-
登录
-
浏览商品
-
将商品添加到购物车
-
下订单
-
进行支付
-
追踪配送
-
管理商品
用例图提供系统功能的高层视图,而不描述实现细节。
重要关系包括:
-
关联:将参与者与用例连接起来。
-
包含:显示始终被另一个用例复用的行为。
-
扩展:显示可选或条件行为。
-
泛化:显示参与者或用例之间的特化关系。
例如,下订单可能包含进行支付而应用折扣可能扩展下订单.
2. 活动图

活动图表示流程或用例中的控制流。它适用于建模顺序和并发工作流。
示例:下订单
开始
|
浏览商品
|
将商品加入购物车
|
进入结账流程
|
输入支付信息
|
支付成功?
/
否 是
| |
显示错误 创建订单
|
发送确认信息
|
结束
活动图可以表示:
-
动作
-
决策
-
合并
-
循环
-
并行活动
-
开始和结束节点
-
用于职责的泳道
泳道可以显示哪个参与者或系统组件执行每个操作。例如,一个泳道可能代表客户,另一个代表订单服务,还有一个代表支付网关。
3. 序列图

序列图展示了对象或组件如何按时间顺序进行通信。
示例:下订单
客户 -> WebApp:提交订单
WebApp -> 订单服务:createOrder()
订单服务 -> 支付服务:authorizePayment()
支付服务 --> 订单服务:paymentApproved
订单服务 -> 通知服务:sendConfirmation()
订单服务 --> WebApp:orderCreated
WebApp --> 客户:显示确认信息
序列图包含:
-
参与者
-
生命线
-
消息
-
激活条
-
返回消息
-
条件
-
循环
-
替代方案
-
并行交互
它们特别适用于解释 API 调用、服务交互、认证流程和错误处理。
4. 通信图

通信图在早期 UML 版本中曾被称为协作图,它强调对象之间的关系以及它们之间交换的消息。
与序列图主要关注垂直时间线不同,通信图侧重于:
-
对象
-
对象之间的链接
-
编号的消息
-
协作结构
示例:
1: submitOrder()
客户 ----------------> Web 应用
2: createOrder()
Web 应用 ------------------> 订单服务
3: authorizePayment()
订单服务 -------------> 支付服务
当对象协作的结构比精确的视觉时间线更重要时,通信图非常有用。
5. 状态机图

状态机图展示了对象或系统如何响应事件而改变状态。
订单可能经历以下状态:
新建 -> 待支付 -> 已支付 -> 已发货 -> 已交付
|
v
已取消
转换可以标记为事件或条件:
待支付 -- paymentApproved --> 已支付
待支付 -- paymentFailed --> 支付失败
状态机图适用于:
-
订单生命周期
-
用户账户状态
-
工作流状态
-
设备行为
-
网络连接状态
-
审批流程
当对象的行为在很大程度上取决于其当前状态时,它们特别有价值。
6. 时序图

时序图说明了随着时间的推移,一个或多个元素的状态或值如何变化。
它通常用于:
-
实时系统
-
嵌入式系统
-
通信协议
-
软硬件协调
-
对性能敏感交互
例如,时序图可以展示以下之间的关系:
-
设备信号
-
控制器状态
-
传感器值
-
在定义时间间隔内的响应
7. 交互概览图

交互概览图通过将活动风格的控制流与交互图相结合,提供交互的高级视图。
它可以展示:
-
主要交互的顺序
-
交互片段之间的决策
-
并行交互路径
-
对序列图或通信图的引用
例如,在线订单的交互概览可以连接:
-
客户身份验证
-
产品选择
-
结账交互
-
支付授权
-
订单履行
当某个过程过于复杂,无法用单个序列图解释时,此图非常有用。
UML 关系
理解 UML 关系对于创建有意义的图表至关重要。

关联
关联表示两个元素之间的结构连接。
客户 -------- 订单
这表明客户和订单之间存在关联。
定向关联
定向关联显示单向的可导航性。
订单 ------> 支付
这表明订单知道或使用支付对象,但反之可能不成立。
泛化
泛化表示继承或特化。
用户
/
客户 管理员
在此,客户和管理员是用户.
依赖
依赖表示一个元素临时使用或依赖于另一个元素。
OrderService - - - -> PaymentGateway
对支付网关的更改可能会影响订单服务。
聚合
聚合表示一种整体与部分的关系,其中部分可以独立存在。
Team ◇------ Player
即使团队解散,球员仍可能继续存在。
组合
组合表示一种强烈的整体与部分关系。部分通常依赖整体来管理其生命周期。
订单 ◆------ 订单项
一个订单项可被视为订单的一部分,且在该订单之外可能无意义。
实现
实现表示一个类或组件实现了某个接口。
支付服务 - - -|> 支付处理器
该支付服务提供了由支付处理器接口所定义的行为。
UML 示例:在线购物系统
考虑一个在线购物应用程序。
主要参与者
-
客户
-
管理员
-
支付网关
-
配送服务
主要用例
-
创建账户
-
浏览商品
-
将商品添加到购物车
-
下订单
-
进行支付
-
追踪配送
-
管理库存
可能的类
客户
商品
购物车
订单项
订单
订单项
支付
发货
可能的服务组件
用户服务
目录服务
购物车服务
订单服务
支付服务
配送服务
通知服务
示例交互
当客户下订单时:
-
客户提交购物车。
-
Web 应用程序将请求发送至订单服务。
-
订单服务验证商品。
-
支付服务授权支付。
-
订单被保存。
-
配送服务收到通知。
-
通知服务发送一封确认邮件。
该单一业务流程可通过多个 UML 图来表示:
-
用例图:显示客户可以下订单。
-
活动图:显示工作流程和决策点。
-
序列图:显示服务之间的消息。
-
类图:显示
客户,订单,产品及相关类。 -
组件图:显示所涉及的服务。
-
部署图:显示这些服务运行的位置。
如何选择正确的 UML 图
| 建模目标 | 推荐的 UML 图 |
|---|---|
| 显示类及其关系 | 类图 |
| 显示实际的对象实例 | 对象图 |
| 描述系统功能 | 用例图 |
| 建模业务或系统工作流 | 活动图 |
| 显示随时间交换的消息 | 序列图 |
| 显示对象协作 | 通信图 |
| 显示生命周期和状态变化 | 状态机图 |
| 显示软件模块或服务 | 组件图 |
| 显示物理部署 | 部署图 |
| 组织模型元素 | 包图 |
| 显示分类器的内部部分 | 组合结构图 |
| 显示随时间的变化 | 时序图 |
| 总结多个交互 | 交互概览图 |
| 为特定领域扩展UML | 配置文件图 |
良好的建模实践是仅选择能够回答特定问题的图表。创建所有可能的UML图表会使文档变得不必要的复杂。
UML与软件开发生命周期
UML可以支持软件开发的多个阶段。
需求分析
用例图有助于识别参与者和系统功能。活动图可以阐明业务流程和工作流。
系统分析
类图可以表示领域概念。序列图可以帮助分析师理解用例是如何实现的。
架构设计
组件图、包图和部署图有助于定义应用程序及其基础设施的结构。
详细设计
类图、序列图、状态机图和组合结构图可以描述实现职责和对象交互。
开发
开发人员可以在实现类、服务、API和数据库结构时将模型作为参考。
测试
测试人员可以从用例、活动图和序列图中推导出测试场景。状态机图有助于识别有效和无效的状态转换。
维护
UML 图可为现有系统提供文档,并帮助团队评估拟议变更的影响。
使用 Visual Paradigm 创建 UML 图
Visual Paradigm 是一个可视化建模和软件设计平台,支持 UML 图创建以及其他建模和开发活动。其 UML 功能包括类图、序列图、用例图、活动图、组件图、部署图、状态机图、包图、对象图和复合结构图等。
启动 UML 项目
Visual Paradigm 中的实用工作流程如下:
-
创建一个新项目。
-
将模型组织为以下包,例如:”
需求,领域模型,服务“,以及”部署. -
创建用例图以捕获系统功能。
-
为重要工作流添加活动图或序列图。
-
为领域模型创建类图。
-
添加组件图和部署图以描述架构。
-
与利益相关者一起审查图表。
-
随着系统的演进更新模型。
-
在需要时导出图表或生成文档。
创建类图
创建类图的步骤如下:
-
创建一个新的类图。
-
添加主要的领域类。
-
添加属性和操作。
-
使用适当的关联关系连接类。
-
添加多重性。
-
在需要时标明继承关系和接口。
-
安排图表布局,使相关类易于理解。
-
根据需求验证模型。
例如,在线商店的类图可能包含客户, 订单, 商品, 支付,和 发货.
创建用例图
创建用例图的方法包括:
-
识别外部参与者。
-
列出系统的主要功能。
-
添加系统边界。
-
将用例放置在边界内部。
-
将参与者与其参与的用例连接起来。
-
仅在有助于阐明复用或可选行为时,才添加包含或扩展关系。
创建序列图
创建序列图时:
-
识别正在建模的场景。
-
添加参与者或发起组件。
-
添加参与的对象或服务。
-
从左到右排列它们。
-
按时间顺序添加消息。
-
对替代方案、循环和错误条件进行建模。
-
确保每条消息都对应一个合理的职责。
协作与文档
Visual Paradigm 提供可视化建模能力、团队协作功能、文档支持以及旨在将建模与更广泛的软件开发活动相集成的集成工具。其平台还支持协作式图表审查与评论。
某些版本和工作流还可能提供代码工程、数据库建模、模型组织、图表导出和文档生成等功能。这些能力应根据项目需求进行选择,而不是自动添加到每个模型中。
有效 UML 建模的最佳实践
有目的地建模
每张图表都应回答一个明确的问题。例如:
-
客户如何下订单?
-
哪些服务依赖于支付服务?
-
订单可以进入哪些状态?
-
哪些类属于订单领域?
保持图表聚焦
避免将整个系统放在一张图表上。将大型模型划分为较小的视图,分别用于需求、领域结构、行为、架构和部署。
使用一致的命名
在图表间使用相同的名称。如果一张图表将某个组件称为“OrderService”,另一张图表就不应将其称为“OrderManager”,除非它们确实是不同的元素。
选择合适的详细程度
面向利益相关者的图表通常应包含比实现图表更少的技术细节。除非与受众相关,否则不要添加方法签名、数据库字段或特定于框架的细节。
避免不必要的关系
添加所有可能的依赖关系会使图表难以阅读。应包含能够传达有意义设计信息的关系。
在关键处展示多重性
多重性有助于阐明业务规则和数据关系。例如,展示一个订单包含一个或多个订单项,比仅仅连接这两个类更具信息量。
根据需求验证图表
模型仅在准确表示系统时才具有价值。应将图表与需求、测试场景、源代码和利益相关者的反馈进行比较。
将图表作为动态文档使用
当重大设计决策发生变化时,应更新UML图表。过时的图表可能比完全没有图表更令人困惑。
组合互补的图表
没有单一的UML图表能够解释系统的方方面面。类图可以展示结构,而序列图则解释该结构在特定场景下如何行为。
常见错误需避免
-
将UML视为源代码
-
在没有明确目的的情况下创建图表
-
在不加解释的情况下混合概念细节与实现细节
-
在更适合使用组合的地方使用继承
-
从重要关系中省略多重性
-
向单个图表添加过多元素
-
使用错误的包含和扩展关系
-
未能对错误流程和替代流程进行建模
-
允许不同的图表使用不一致的名称
-
仅因图表在视觉上看起来有条理就假定其正确
UML 2.x 与图表数量
早期 UML 版本通常描述的图表类型较少。UML 2.x扩展了该语言,并引入或规范了额外的图表,包括:
-
组合结构图
-
通信图
-
交互概览图
-
时序图
它还将状态图重命名为状态机图。常见的 UML 2.x 分类包含 14 种图表:七种结构图和七种行为图。行为图组包括用例图、活动图、状态机图、序列图、通信图、交互概览图和时序图。结构图组包括类图、对象图、组件图、组合结构图、部署图、包图和配置文件图。
因此,在常用的 14 种图表分类下,将 UML 2.x 描述为仅包含 13 种图表的列表是不完整的。
结论
UML 提供了一种实用的可视化语言,用于理解、设计和记录软件系统。它有助于团队沟通需求、探索架构、建模对象关系、描述工作流程以及解释运行时行为。
最常用的图表通常是:
-
用于功能需求的用例图
-
用于静态结构的类图
-
用于工作流的活动图
-
用于交互的序列图
-
用于架构的组件图
-
用于基础设施的部署图
-
用于生命周期行为的状态机图
Visual Paradigm可以通过提供以下工具来支持此建模过程:创建 UML 图、组织模型、与团队成员协作以及生成技术文档。最有效的方法并非不加选择地使用所有 UML 图,而是选择那些能够阐明重要设计问题的图。
当一致使用并与实际系统保持对齐时,UML 便不仅仅是一组符号的集合:它成为一种共享的设计语言,将业务需求、软件架构、实现、测试和长期维护连接起来。












