找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2034

积分

0

好友

268

主题
发表于 昨天 03:43 | 查看: 6| 回复: 0

UML 的真正价值在于:它并非一套僵化的规范,而是一种用于结构化思考与团队沟通的通用语言。掌握 UML 是软件设计的必备技能,也是高阶开发者的核心能力之一。

类图(Class Diagram)

类图不同于 ER 图——后者用于描述关系型数据库中的实体及其关系,而类图则是面向对象开发的核心工具。一份设计良好的类图,几乎等同于系统的代码骨架。

认识类图

类图包含接口、类、实现关系、泛化关系、关联关系、依赖关系,同时还可以包含约束、注解和包等元素。

UML类图示例展示各类关系

类是面向对象系统中组织结构的核心,是对具有相同属性、行为、关系和语义对象的抽象。

类图的基本结构模板

类包括名称(Name)、属性(Attribute)和操作(Operation)。

接口

接口是一种特殊的类,所有接口在 UML 中都带有 «interface» 构造型。在 UML 中,接口可以使用一个带有名称的小圆圈来表示,并通过一条实现关系(Realize)线与实现它的类相连接。

类与接口的实现关系示意图

类之间的关系

类之间的关系主要包括:实现关系(Realization,用于接口实现)、泛化关系(Generalization,即继承)、依赖关系(Dependency)和关联关系(Association,其中包含特殊的聚合与组合)。

依赖关系

依赖表示一个模型元素(客户方)需要另一个模型元素(供应方)来达到某种目的,供应方的修改会影响客户方的执行结果。依赖关系暗示着客户方如果没有供应方的支持是不完整的。例如,给雇员计算工资时需要用到计算器。在 UML 中,依赖关系用一个从使用者指向提供者的虚箭头表示。

依赖关系示意图:客户与提供者

提示:依赖关系应从语义层面理解——客户方依赖提供方以实现某项功能,若提供方发生变更,可能影响客户方的行为。在 Java 中,方法的入参可视为该类对参数类型的依赖。

泛化关系

泛化(继承)关系用来描述类的一般和具体之间的关系,即 is a kind of 的关系。

泛化(继承)关系图示:父类与子类

在 UML 中,使用一条带空心三角箭头的实线表示,箭头指向父类。

关联关系

关联关系是一种结构关系,指出了一个事物的对象与另一个事物的对象之间的连接。

关联关系示例与多重性标记

导航性:若 A 指向 B(具有导航性),则 B 通常为 A 的成员变量。提示:关联关系中有 1 对 n,也有 1 对 1。如果带有箭头,则表明是单向关联。

聚合关系与组合关系

关联关系有两种非常重要的特殊形式,分别是聚合关系和组合关系。

聚合关系与组合关系对比示例

聚合和组合都是关联关系的一种特殊情况,如何区别它们,需要从语义的角度去理解:

  • 组合 :部分与整体是强依赖关系,缺一不可。如果整体不存在,部分也将无法独立存在。例如,CPU 和主板是台式主机的核心组成部分,主机不存在,则这些部件失去在此上下文中的意义。
  • 聚合 :表示整体与部分之间较弱的所属关系。部分可以独立于整体而存在。例如,大雁和雁群,一只大雁可以离开某个雁群。

实现关系

大多数情况下,实现关系用来规定接口和实现接口的类或者组件之间的关系。在 UML 中,实现关系的表示形式使用一条带封闭空箭头的虚线。实现关系还有一种省略表示法:将接口表示为一个小圆圈,并和实现它的类之间用一条实线相连。

接口实现的两种UML表示方法

提示:在不同的 UML 工具中,实现关系可能有不同的展现形式。

综合的类图实例

  • 接口 :使用 «interface» 进行标注,是对一组对象行为的抽象,不包含具体实现。例如“飞翔”接口,需要实现类完成“飞”的动作。
  • :抽象类名称需要用斜体表示。类包括:类名称、特性和操作。
  • 实现 :例如,大雁类实现“飞翔”接口。
  • 依赖关系 :例如,动物类依赖氧气和水(通过方法参数)。
  • 泛化关系 :例如,鸟类继承自动物类。
  • 聚合关系 :例如,大雁和雁群的关系。
  • 组合关系 :例如,鸟类和翅膀的关系。
  • 关联关系 :例如,企鹅类和气候类之间的关联。

综合UML类图实例:动物世界模型

面向对象设计的核心在于分析与抽象,UML 仅是辅助这一过程的可视化工具。

用例图(Use Case Diagram)

用例描述了用户如何通过系统实现特定目标。用例图由系统边界、参与者(Actor)和用例(Use Case)三者构成,用于回答三个关键问题:系统是什么?谁在使用系统?用户希望通过系统完成什么?简单来说,用例图展示了谁使用这个系统能做什么。

认识用例图

用例图描述参与者与用例之间的通信,可以从不同视角展现系统的功能性需求。它既是外部用户能够观察到的系统功能逻辑,也是开发者的系统蓝图和开发依据。

销售系统用例图示例

认识元素

参与者/执行者

执行者是系统、子系统或类发生交互作用的外部用户、进程或其他系统的理想化角色。

参与者符号表示

用例

用例是一个外部可见的系统内聚功能单元,由一种被称为主体(Subject)的类所提供。用例的目的是在不揭示主体内部结构的情况下定义一个连贯行为。例如,“产品维护”用例可能包含增、删、改、查等子流程。

用例符号表示

关系

用例图中涉及的关系有:关联、泛化、包含、扩展。

用例图关系类型与符号

  • 包含 :一个用例包含其他用例,并将其作为自身的必需片段。
  • 扩展 :一个用例可以被定义为基用例的增量扩展。扩展关系箭头指向被扩展的基用例。
  • 泛化 :一个用例可以被细化为一个或多个子用例。子用例可以应用于父用例能够应用的场合。

购物者订购用例图
用例图关系连接示例
带条件的用例扩展点

案例

下图展示了一个简单购物系统的部分功能用例图。

购物系统用例图案例

  • 购买者会员系统管理员 是参与者(一个实际用户可扮演多个参与者角色)。
  • 购买者会员商品查询 用例交互。
  • 电子产品查询 用例继承 商品查询,是泛化关系。
  • 商品信息维护 用例包含了 产品信息修改 用例。
  • 导出电子产品查询 是对 电子产品查询 的扩展——它在基础查询的特定扩展点插入“导出”行为,而基础查询本身对此无感知。

提示:用例图的颗粒度需要合理把握,防止粒度过细导致滥用。

序列图(Sequence Diagram)

序列图按时间顺序展示对象间的消息交互,强调“谁在什么时候调用了谁”。它常用于 API 调用链分析、分布式事务协调和性能瓶颈定位。

认识时序图

序列图强调消息传递的时间顺序,即对象之间发送与接收消息的先后次序。它用来表现用例中的行为顺序,描述了如何一步步完成系统的某项功能,揭示了特定场景下的对象交互。在 UML 中,序列图将交互关系表示为一个二维图,纵轴是时间轴,时间向下延伸;横轴代表了参与交互的各独立对象。

汽车租赁流程序列图示例

元素组成

序列图的主要元素包括:对象、生命线、激活、消息。

对象

序列图中的对象可以是系统参与者或任何有效的系统对象,其符号与对象图相同,使用矩形表示。对象及其类的名称带有下划线,格式为“对象名:类名”。通常将交互的发起者(主角)置于序列图的顶部。

序列图中的对象表示

生命线

生命线是一条垂直的虚线,表示序列图中的对象在一段时间内的存在。每个对象底部中心都带有生命线,它是一个从图顶部延伸到底部的时间线。

带生命线的对象示例

激活

激活表示对象操作的执行,即对象被占用以完成某个任务。去激活则表示对象处于空闲状态,等待消息。激活在序列图中用一个细长的矩形框(激活条或控制期)表示,其顶端与激活时间对齐,底端与完成时间对齐。

对象的激活条与控制流

消息

消息是从一个对象(发送者)向另一个或几个其他对象(接收者)发送信号,或调用另一个对象的操作。消息可以激发某个操作、唤起信号或导致目标对象的创建或撤销。消息的表示形式为从发送者生命线指向接收者生命线的箭头,箭头类型表示消息的类型。

案例

下面以“教师查看学生成绩”为例,介绍如何创建序列图。

教师查看学生成绩序列图

活动图(Activity Diagram)

活动图类似于流程图,但支持并行、分支、泳道等元素,用于描述业务流程或算法逻辑。

认识活动图

在 UML 中,活动图中的活动既可以是手动执行的任务,也可以是自动执行的任务,使用圆角矩形表示。活动强调的是动作,因此圆角矩形中的文字应是动词短语。

订单处理活动图

活动图与流程图的区别

活动图描述系统使用的活动、判定点和分支,着重表现系统的行为及活动的顺序关系。而流程图着重描述处理过程,其控制结构是顺序、分支和循环,各个处理过程之间有严格的顺序和时间关系。

传统程序流程图示例
制作咖啡的活动图示例

关键区别在于:

  1. 活动图能够表示并发活动的情形,而流程图不能。
  2. 活动图是面向对象的,而流程图是面向过程的。

为什么要用活动图

  • 描述一个操作执行过程中所完成的工作。
  • 对用例描述尤其有用,可建模用例的工作流。
  • 显示如何执行一组相关动作及其对周围对象的影响。
  • 有助于理解业务处理过程,便于与领域专家交流。
  • 描述复杂过程的算法。

组成活动图的图形元素

活动图由动作状态、活动状态、动作流、分支与合并、分叉与汇合、泳道、对象流等元素组成。

动作状态

动作状态执行原子的、不可中断的动作,完成后通过转换转向另一个状态,使用平滑的圆角矩形表示。

动作状态符号

活动状态

活动状态用于表达状态机中非原子的运行,图标也是平滑的圆角矩形,可包含入口和出口动作等信息。

活动状态符号示例

动作流

所有动作状态之间的转换称为动作流,用带箭头的直线表示,箭头指向转入的方向。

动作流箭头表示

分支与合并

分支用菱形表示,有一个进入转换和一个或多个带互斥监护条件的出转换。合并则表示两个或多个控制路径的汇合,标志着条件行为的结束。

分支判断菱形框
合并点示例

分叉与汇合

分叉和汇合都使用加粗的水平(或竖直)线段表示。分叉将动作流分为多个并发分支,汇合同步这些并发分支,所有分支都到达汇合点后控制才能继续。

分叉与汇合符号

区分合并与汇合:合并结合的是互斥的控制路径(每次只走一条),而汇合结合的是并行的控制路径(所有路径都要走,先到的需等待)。

泳道

泳道将活动图中的活动按职责划分为若干组,并指定给负责该组活动的业务组织。泳道用垂直实线绘出,每个活动只能属于一个泳道。

带泳道的订单处理活动图

在泳道图中,分叉和汇合通常成对出现,用以描述并行和同步。活动图着重表现系统的行为顺序,而分支与合并表示的是互斥的选择路径。

状态机图(State Machine Diagram)

状态机图描述对象在其生命周期内响应事件所经历的状态变迁,常用于订单状态流转、设备控制逻辑等场景。

认识状态机

在面向对象分析与设计中,对象的状态、状态转换、触发事件及对象响应等都可以用状态图来描述。状态图通过建立类对象的生命周期模型来描述对象随时间变化的动态行为。

电梯运行状态图

状态图组成

状态图主要由初始状态、终止状态、状态、转换、判定等元素组成。

案例

以下状态图描述了银行卡从制造到使用的各种状态过程。

银行卡生命周期状态图

创建步骤通常包括:1. 选中建模实体;2. 识别并建模各种状态;3. 找出触发状态转换的相关事件和行为。

通信图(Communication Diagram,原协作图)

注:“协作图”是 UML 1.x 的旧称,UML 2.x 已统一更名为“通信图”。
通信图强调发送和接收消息的对象之间的组织结构,显示对象、对象间的链接以及它们之间的消息。

认识通信图

通信图表现对象协作关系,显示了协作中作为各种类元角色的对象所处的位置及连接关系。

学生登录系统通信图

组成元素

通信图由对象、消息和链构成。

对象

通信图中的对象也是类的实例,表示形式为带下划线的矩形框,格式为“对象名:类名”。

通信图中的对象实例

消息

通信图通过一系列带顺序号的消息来描述系统的动态行为。顺序号是整数前缀,从1开始递增,嵌套消息使用点表示法(如1.1)。

带顺序号的消息示例

链是关联的实例,用连接对象的实线表示,是对象间发送消息的路径。可以附加路径构造型(如<<local>>)来进一步说明连接性质。

对象间的链(连接)

通信图与序列图的区别与联系

两者都是交互图,都描述对象交互并包含消息集合。核心区别在于:

  • 序列图:强调消息传送的时间先后顺序。
  • 通信图:强调对象之间的网络结构和发送消息的整体行为。

时序图示例(ATM取款)
ATM取款时序图

通信图示例(ATM取款)
ATM取款通信图

案例

以下是“教师查看学生成绩”的通信图示例。

教师查看学生成绩通信图

组件图(Component Diagram)

组件图用于可视化系统内部组件的组织和依赖关系,有助于将复杂系统分解为可管理的部件。

认识组件图

组件图展示系统内部各模块(组件)的组织方式及其依赖关系,体现“小模块如何组装成大系统”的架构逻辑。

简单组件示例
银行与房地产系统组件图

案例

一个在线商店系统的组件图示例。

在线商店系统组件图

部署图(Deployment Diagram)

部署图展示软件组件如何部署到硬件节点上,清晰显示组件在服务器、设备等节点上的物理分布和连接。

认识部署图

部署图用于表示一组物理节点的集合及节点间的相互关系,从而建立系统物理层面的模型,在实际开发中应用广泛。

简单部署图节点连接

案例

以下是一个点唱机系统的部署图示例,展示了软件工件在硬件节点上的部署。

点唱机系统部署图

对象图(Object Diagram)

对象图是系统在特定时刻的静态快照,展示当时存在的对象实例及其之间的具体链接关系。

认识对象图

对象图提供了系统结构的瞬时视图,捕捉了存在的实例及其关联。对象之间的关系使用与类图相似的符号定义。

UML关系类型与符号总结
对象图关系示例

包图(Package Diagram)

包图用于管理大型项目的模型,呈现子系统或模块之间的结构和依赖性。

认识包图

使用包图可以对相关元素进行分组,并清晰地展示包与包之间的依赖关系。

电商系统包图示例

总结

UML 是否过时?当前开发者更倾向于使用白板、Draw.io 或 Excalidraw 等工具绘制“类 UML 风格”的草图,而非严格遵循 UML 规范。这并非否定 UML 的价值,而是强调 沟通效率优先于形式合规

对于软件工程师而言,无需精通所有 UML 图,但应掌握核心的几种:类图(系统骨架)、序列图(交互时序)、状态机图(生命周期)、用例图(功能需求)和部署图(物理架构)。这些图表是进行有效系统分析、设计和沟通的强力工具。

一些参考资料和网站:

  • PlantUML 中文组件图指南: plantuml.com/zh/componen…
  • Visual Paradigm 教程: www.visual-paradigm.com/tutorials/
  • 书籍:《大象 Thinking in UML 》第二版

掌握 UML 的核心思想,能帮助你在云栈社区等平台更清晰地进行技术讨论与架构设计分享。




上一篇:SQL数据分析常用语句全解:从入门到高阶实战97条
下一篇:从概念到实践:软件架构设计核心思想与备考指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-14 15:55 , Processed in 0.248310 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表