程序员必知必会7种UML图(类图、序列图、组件图、部署图、用例图、状态图和活动图)画法盘点
众所周知,软件开发是一个分阶段进行的过程。不同的开发阶段需要使用不同的模型图来描述业务场景和设计思路,在不同的阶段输出不同的设计文档也是必不可少的,例如,在需求分析阶段需要输出领域模型和业务模型,在架构阶段需要输出物理架构设计,在详细设计阶段需要输出数据库设计等。这样做可以更好地实践软件开发,并提高软件开发的实用性。
软件建模与设计过程可以分为三个阶段:需求分析、架构设计和详细设计。在这三个阶段中,大量使用符合 UML 规范的模型图,其中常用的有 7 种,包括类图、序列图、组件图、部署图、用例图、状态图和活动图。
在需求分析阶段,使用用例图和领域模型图描述用户需求和业务场景。在架构设计阶段,使用组件图和部署图描述软件系统的组成部分和部署情况。在详细设计阶段,使用类图、序列图和状态图描述软件系统的实现细节。
下面我们将探讨如何绘制这 7 种模型图,以及如何在不同阶段使用这些模型来生成相应的设计文档。
类图
类图是软件设计中使用最广泛的 UML 图形之一,用来描述类的特性以及类之间的静态关系。在一个类图中,每个类都由三个部分组成:类名、属性列表和方法列表。
除了描述类的基本特征,类图还用来表示类之间的关系,其中包括六种静态关系:
-
关联(Association):表示一个类对象与另一个类对象之间的关系,比如订单与客户之间的关系。
-
依赖(Dependency):表示一个类对另一个类的使用或调用,比如客户下订单时需要使用订单类。
-
组合(Composition):表示一种包含关系,表示一个类对象包含另一个类对象,比如一个订单包含多个商品。
-
聚合(Aggregation):也表示一种包含关系,但是聚合关系中包含的类对象可以被多个类共享,比如一个学校包含多个班级。
-
继承(Inheritance):表示一个类继承自另一个类,可以从父类中继承属性和方法,并且可以添加新的属性和方法。
-
泛化(Generalization):与继承关系相似,但泛化关系可以用来表示更抽象的关系,比如多个类都实现了一个接口。
通过绘制类图,我们可以清晰地描述一个软件系统中的类及其之间的关系,帮助开发人员更好地理解软件系统的结构和功能。
在UML工具中把相关的一组类及其关系用一张图画出来,就是类图。

如上图所示,描述的就是一个典型的责任链模式的实现类图。
类图主要是在 详细设计 阶段画,一旦类图设计完成,开发工程师可以根据类图来实现代码。只要类方法的逻辑不是太复杂,不同工程师实现的代码几乎是一样的,这有利于保证软件的规范和统一性。在实际应用中,通常不需要画出所有类的类图,只需要画出核心、代表性、技术难度较高的类图即可。

除了在详细设计阶段绘制类图外,还可以在需求分析阶段使用类图来表示关键领域模型对象。在这个阶段中,我们不要将注意力集中在属性或行为上,而应该专注于识别领域对象及其之间的关系。因此,可以使用简化的类图来描述,只需要绘制类的名称和它们之间的关系即可。
如上所示描述的是在需求分析阶段挖掘出SIM卡、运营商、手机、手机厂商等模型对象之间的关系。
序列图
类图之外,另一种常用的图形是序列图。
类图描述类之间的静态关系,而序列图用于描述参与者之间的动态调用关系。每个参与者都有一条垂直向下的生命线,该生命线用虚线表示。参与者之间的消息按照从上到下的顺序表示它们的调用顺序关系,这就是序列图这个词的来源。每个生命线都有一个激活条,它是图中的细长矩形条,只有在参与者活动时才是激活的。

通常使用序列图表示对象之间的交互,这些对象可以是类对象,也可以是更大的参与者,如组件、服务器、子系统等。总之,只要涉及到不同参与者之间的交互,都可以使用序列图,比如下面这张图就是业务分析阶段,系统建设后完成后的业务流程。

记住,在软件设计的不同阶段都可以使用序列图。
组件图
组件是比类更大粒度的设计元素,通常一个组件中包含多个类。组件图有时与包图的用途相似,通常用于描述物理组件,如JAR、DLL等。在实践中,我们更多地使用组件图进行模块设计。

组件图描述组件之间的静态关系,主要是依赖关系。如果想要描述组件之间的动态调用关系,可以使用组件序列图,以组件作为参与者,描述组件之间的消息调用关系。
由于组件的粒度较大,通常用于描述和设计软件的模块及其之间的关系。因此,在设计的早期阶段就需要画出组件图,一般用于架构设计阶段。
部署图
部署图描述的是软件系统最终的物理部署情况,包括需要部署的服务器数量、关键组件的部署位置等。它是软件系统最终呈现的物理蓝图,能够让客户、老板和工程师清晰地了解系统的最终运行状态,以及与现有系统和第三方服务器的关系。通过部署图,可以预估服务器和第三方软件的采购成本。
因此,部署图是整个软件设计模型中相当宏观的一种图,需要在设计早期就绘制。各方可以根据部署图讨论是否认可该方案,只有对部署图达成共识,才能继续后面的细节设计。部署图主要用于架构设计阶段,并且与组件图要彼此呼应。

用例图
用例图分为业务用例和系统用例,业务用例图主要体现在 业务分析阶段, 描述一个承建系统的组织对外提供的能力,系统用例体现在需求分析阶段描述系统对外提供的能力。

这张图中,左边是业务用例图,右边是系统用例图。虽然它们的画法相似,但它们本质上有很大的区别,具体可以查看我之前写的这篇文章。
图中的人形元素称为角色,角色可以是人也可以是其他系统。由于系统的功能可能很复杂,用例图可能仅包含其中的一小部分功能,这些功能被画在一个矩形框内,这个矩形框是用例边界。矩形框里面的椭圆表示单个功能,它们可以相互依赖或需要扩展。因为用例图中的功能描述相对简单,所以通常需要配以文字说明以形成需求文档。
状态图
状态图用来展现单个对象生命周期中的状态变迁。
在业务系统中,许多重要的领域对象都有相当复杂的状态变化,比如订单,它们可以有待付款、待审核、待发货、待收货、交易关闭和交易完成等各种状态。
这些状态变化可以在用例图中用文本形式描述,并随着各个用户的不同操作而改变。但是,使用这种方法描述状态时,状态会分散到不同的地方,这样可能会导致开发错误以及产品经理在设计时的困惑。
采用UML状态图可以有效地解决这些问题,因为它可以在一张图表中展示对象的整个生命周期以及各个状态和变迁之间的关系。比如下面的图表展示了一个订单从创建到交易完成的状态变化。

状态图要在需求分析阶段画,描述状态变迁的逻辑关系,在详细设计阶段也要画,这个时候,状态要用枚举值表示,以指导具体的开发。
活动图
活动图常用于描述系统或业务流程中的动态行为。它可以清晰地展现从一个活动到另一个活动的控制流,描绘出系统或业务流程的逻辑和流程,让开发人员更好地了解整个系统的运作方式。
在活动图中,实心圆表示流程的开始,空心圆表示流程的结束,圆角矩形表示活动,菱形表示分支判断。这些符号的使用能够使活动图更加规范化和可读性,有助于提高系统开发的效率和质量。

此外,活动图引入了一个重要的概念——泳道。活动图可以根据活动的范围,将活动根据领域、系统和角色等划分到不同的泳道中,使流程边界更加清晰。
流程图也比较有普适性,可以在需求分析阶段描述业务流程,也可以在架构设计阶段描述子系统和组件的交互,还可以在详细设计阶段描述一个类方法内部的计算流程。
使用合适的 UML 模型构建一个设计文档
UML 模型图本身并不难掌握,但如何在正确的场合下用适当的 UML 模型表达设计意图,形成一套清晰且详细的软件模型,并在团队内外达成共识的设计文档则需要注意。
根据软件设计不同阶段的需要,我们可以使用不同的模型图进行建模。
在需求分析阶段,我们可以使用用例图、活动图、时序图和简化的类图进行领域模型抽象和关系描述。
在架构设计阶段,通过组件图、组件时序图和部署图描述系统物理蓝图和模块关系。
在详细设计阶段,主要侧重于类图和类的时序图,而对于复杂的方法逻辑,可以使用方法的活动图进行描述。
小结
掌握类图、时序图、组件图、部署图、用例图、状态图、活动图这七种UML模型图,根据实际场景,在需求分析、架构设计和详细设计阶段选择并巧妙应用对应的模型图,有助于有效地进行软件建模和系统设计,成为一个掌控大局、指导技术团队的优秀架构师。
要注意模型图的规范和注释,遵循命名规范,对模型元素进行命名,注释模型元素的关系和属性等,简洁明了。此外,UML模型图只是设计文档的一部分,需要与其他文档相结合,如需求文档、设计文档、测试文档等,形成一个完整的设计文档,指导软件开发。
对于画UML的工具,有收费的专业软件设计工具像EA(Enterprise Architect) 、Astah和亿图,以及免费的在线工具比如draw.io,processon等,建议可以根据自身需要选择合适的工具,同时也建议从简单易用的工具入手。
相关文章:
程序员必知必会7种UML图(类图、序列图、组件图、部署图、用例图、状态图和活动图)画法盘点
众所周知,软件开发是一个分阶段进行的过程。不同的开发阶段需要使用不同的模型图来描述业务场景和设计思路,在不同的阶段输出不同的设计文档也是必不可少的,例如,在需求分析阶段需要输出领域模型和业务模型,在架构阶段…...
基于asp的搜索引擎开发和实现
随着因特网的迅猛发展、WEB信息的增加,用户要在信息海洋里查找信息,就像大海捞针一样,搜索引擎技术恰好解决了这一难题。目前,搜索引擎系统可以分类三大类,分别是:目录式搜索引擎:以人工方式或半…...
代码随想录刷题-字符串-实现 strStr()
文章目录实现 strStr()习题暴力解法kmp 解法实现 strStr() 本节对应代码随想录中:代码随想录,讲解视频:帮你把KMP算法学个通透!(理论篇)_哔哩哔哩_bilibili、帮你把KMP算法学个通透!࿰…...
前端已死?金三银四?你收到offer了吗?
目录 一、前言 二、“唱衰” 三、不局限于框架、前端 四、打动面试官 五、正向加成 六、小结 一、前言 最近在脉脉、知乎等平台都有人在渲染前端从业人员的危机,甚至使用“前端已死”的字眼,颇有“语不惊人死不休”的意味,对老鸟来说&a…...
C生万物 | 十分钟带你学会位段相关知识
结构体相关知识可以先看看这篇文章 —— 链接 一、什么是位段 位段的声明和结构是类似的,有两个不同: 位段的成员必须是 int、unsigned int 或signed int位段的成员名后边有一个冒号和一个数字 在下面,我分别写了一个结构体和一个位段&…...
Spring Boot基础学习之(十):修改员工的信息
注意:spring boot专栏是一个新手项目,博文顺序则是功能实现的流程,如果有看不懂的内容可以到前面系列去了解。 本次项目所有能够使用的静态资源可以免费进行下载 静态资源 在本篇代码DAO层将通过Java文件去实现,在这里就不连接数…...
闭关十几天,我完成了我的毕业设计
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,也会涉及到服务端(Node.js) 📃个人状态: 在校大学生一枚,已拿多个前端 offer(…...
认识rust的项目管理工具--cargo
cargo 提供了一系列的工具,从项目的建立、构建到测试、运行直至部署,为 Rust 项目的管理提供尽可能完整的手段。不过,我们无需再手动安装,之前安装 Rust 的时候(用rustup或者vscode加插件的方式安装)&#…...
面试常问的Linux之 I/O 复用
I/O 复用 一、I/O的概念 在Linux系统中,I/O(输入/输出)指的是计算机系统的数据交换过程,包括从外部设备读取数据(输入)和将数据发送到外部设备(输出)。I/O操作是Linux系统中非常重要…...
MySQL-binlog+dump备份还原
目录 🍁binlog日志恢复 🍂binlog介绍 🍂Binlog的用途 🍂开启binary log功能 🍂配置binlog 🍁mysqldump 🍂数据库的导出 🍂数据库的导入 🍁mysqldumpbinlog 🦐…...
互联网络-单级互联网络
1.立方体单级网络 1.定义 立方体单级网络(cube)的名称来源于下图所示的三维立方体结构,如010只能连接到000、011、110,不能直接连接到对角线上的001、100、101、111。 2.例题 1.编号为0、1、2、3、4,…,15的16个处理器,用单级互联网络互联,用Cube0互联函数时,与第10…...
上海亚商投顾:沪指四连阳重回3300点 中字头个股再发力
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪大小指数今日走势分化,沪指低开后震荡反弹,创业板指盘中跌超1%。中字头个股再度发力&#x…...
LeetCode:150. 逆波兰表达式求值—栈
🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀算法专栏: 👉🏻123 一、🌱150. 逆波兰表达式求值 题目描述:给你一个字符串数组 token…...
C/C++每日一练(20230410) 二叉树专场(4)
目录 1. 二叉搜索树迭代器 🌟🌟🌟 2. 验证二叉搜索树 🌟🌟🌟 3. 不同的二叉搜索树 II 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专…...
策化整理1
概述: 本游戏是一款恐怖类解密游戏,以反应毒品的危害和反对家庭暴力为主题 在游戏中玩家扮演被困入梦境内的主人公,寻找逃出梦境的方法 本游戏故事大背景: 主人公的父亲是一名毒贩,在母亲发现父亲开始吸毒后选择与父亲…...
【服务通信自定义srv调用3----客户端的优化】
客户端的优化 服务通信自定义srv调用,客户端随意提交两个数,完成数的相加。也就是实现参数的动态提交: 1.格式:rosrun xxxx xxxx 12 34 2.节点执行时候,需要获取命令中的参数,并且组织进 request 代码中应…...
React跨域解决方案
一、跨域日志报错 我们由于项目需要经常会需要对不同域名、不同子域的网站接口发起请求,有时甚至是对于同一域名的不同端口发起请求,此时我们经常看到以下报错: Access to XMLHttpRequest at xxx from origin xxx has been blocked by COR…...
内存五区的概念,内存池技术的诞生。
首先提出一道经典的面试题来引出今天的主角: 进程的虚拟空间分布是什么样的,全局变量放在哪里? 在数据初始化之后,全局变量放在.data段 在数据未初始化时,全局变量放在.bss段 内存五区 进程虚拟内存主要分为五个部分…...
力扣:字符串中的第一个唯一字符(C++实现)
题目部分: 解题思路: 方案一: 首先认真审题的小伙伴们一定会发现就是题目给了提示只包含小写字母,也就是说我们的排查范围是小写的26个字母。为了怕有的友友们一时短路想不起来,我就其按照顺序列出来吧。 即&#x…...
攻防世界 favorite_number mfw、[BJDCTF2020]ZJCTF,不过如此
favorite_number 进入环境得到源码 <?php //php5.5.9 $stuff $_POST["stuff"]; $array [admin, user]; if($stuff $array && $stuff[0] ! admin) {$num $_POST["num"];if (preg_match("/^\d$/im",$num)){if (!preg_match("…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
