UML(统一建模语言)详解:从理论到实践
1. UML概述
1.1 定义与历史背景
统一建模语言(Unified Modeling Language, UML) 是一种标准化的可视化建模语言,用于描述、设计、构造和文档化软件系统。它诞生于1994-1997年,由Grady Booch、James Rumbaugh和Ivar Jacobson(合称“三友”)整合了Booch方法、OMT和OOSE方法而形成。1997年,UML被国际对象管理组织(OMG)采纳为行业标准。
1.2 核心目标与设计原则
-
可视化:通过图形化表示复杂系统结构。
-
规范化:提供统一的符号和语法规则。
-
文档化:生成易于理解的系统设计文档。
-
支持迭代开发:适应敏捷开发中的需求变更。
1.3 UML 2.x的主要更新
2005年发布的UML 2.0引入了更精细的交互模型(如时序图的分片机制)、组件图的扩展,以及对实时系统的支持(如时间约束标记)。
2. UML的13种标准图表
UML 2.x定义了13种图表类型,分为三大类:
2.1 结构型图表(Structural Diagrams)
-
类图(Class Diagram):描述系统静态结构。
-
对象图(Object Diagram):某一时刻对象实例的快照。
-
组件图(Component Diagram):系统的物理模块划分。
-
部署图(Deployment Diagram):软硬件部署关系。
2.2 行为型图表(Behavioral Diagrams)
-
用例图(Use Case Diagram):用户与系统的交互场景。
-
活动图(Activity Diagram):业务流程或算法流程。
-
状态机图(State Machine Diagram):对象状态变化。
-
交互概览图(Interaction Overview Diagram):活动图与交互图的结合。
-
时序图(Sequence Diagram):对象间消息传递的时间顺序。
2.3 交互型图表(Interaction Diagrams)
(注:时序图、通信图等也被归类为交互型图表)
-
通信图(Communication Diagram):强调对象间的协作关系。
-
时序图(Sequence Diagram):强调时间顺序。
-
时间图(Timing Diagram):带时间约束的交互。
-
交互概览图(Interaction Overview Diagram):高层交互流程。
3. 核心图表详解与示例
3.1 类图(Class Diagram)
用途:定义系统中的类、属性、方法及类之间的关系。
关键元素:
-
类(Class):矩形框,分三栏(类名、属性、方法)。
-
关系:
-
继承(Generalization):空心箭头实线。
-
实现(Realization):空心箭头虚线。
-
关联(Association):普通箭头实线(可标注多重性,如1..*)。
-
聚合(Aggregation):空心菱形箭头。
-
组合(Composition):实心菱形箭头。
-
依赖(Dependency):虚线箭头。
-
示例:
+----------------+ +----------------+ | Person | | Company | +----------------+ +----------------+ | - name: String |<>------->| - name: String | | - age: int | +----------------+ +----------------+
3.2 用例图(Use Case Diagram)
用途:捕获系统功能需求,描述用户(Actor)与系统的交互。
关键元素:
-
参与者(Actor):小人图标。
-
用例(Use Case):椭圆框。
-
关系:
-
关联(Association):参与者和用例之间的连线。
-
包含(Include):虚线箭头+«include»。
-
扩展(Extend):虚线箭头+«extend»。
-
示例:在线购物系统
[Customer] --> (Place Order) (Place Order) .> (Payment) : «include» (Place Order) <.. (Apply Coupon) : «extend»
3.3 时序图(Sequence Diagram)
用途:展示对象间消息传递的时间顺序。
关键元素:
-
生命线(Lifeline):垂直虚线,表示对象存在时间。
-
激活条(Activation Bar):矩形条,表示方法执行时段。
-
消息(Message):带箭头的水平线(同步消息:实心箭头;异步消息:开放箭头)。
示例:用户登录流程
User -> LoginController: submitLogin() LoginController -> AuthService: validateCredentials() AuthService --> LoginController: success LoginController -> User: showHomePage()
3.4 活动图(Activity Diagram)
用途:描述业务流程或算法步骤,类似流程图。
关键元素:
-
起始节点(Initial Node):实心圆。
-
活动(Activity):圆角矩形。
-
决策节点(Decision Node):菱形。
-
并行分叉(Fork/Join):粗水平线。
示例:订单处理流程
(开始)→ [接收订单] → <订单有效?> → 是 → [扣款] → [发货] →(结束) → 否 → [拒绝订单] →(结束)
3.5 状态机图(State Machine Diagram)
用途:描述对象在其生命周期内的状态转换。
关键元素:
-
状态(State):圆角矩形。
-
转移(Transition):带事件的箭头。
-
初始/终止状态:实心圆/圆圈套实心圆。
示例:电梯状态
[Idle] → (有人按按钮) → [Moving] [Moving] → (到达目标楼层) → [Door Opening] [Door Opening] → (门完全打开) → [Door Open]
4. UML在软件开发中的应用
4.1 需求分析阶段
-
用例图:明确系统边界和用户需求。
-
活动图:梳理业务流程。
4.2 系统设计阶段
-
类图:定义领域模型。
-
时序图:设计模块间交互逻辑。
4.3 代码实现与测试阶段
-
组件图:规划微服务架构。
-
状态机图:实现复杂状态逻辑(如订单状态机)。
4.4 文档与团队协作
-
UML图作为交付文档,降低沟通成本。
-
工具支持生成代码骨架(如Enterprise Architect)。
5. UML工具推荐与实践技巧
5.1 工具对比
| 工具名称 | 特点 | 适用场景 |
|---|---|---|
| Enterprise Architect | 功能强大,支持SysML | 大型企业级项目 |
| Visual Paradigm | 界面友好,支持敏捷开发 | 中小型团队 |
| PlantUML | 文本生成图表,版本控制友好 | 开发者文档 |
5.2 最佳实践
-
避免过度设计:只为关键逻辑绘制图表。
-
保持一致性:团队统一符号规范。
-
结合代码迭代更新:防止文档与代码脱节。
5.3 常见误区
-
试图用UML描述所有细节 → 应聚焦核心逻辑。
-
忽略与利益相关者的沟通 → 用用例图对齐需求。
6. UML的局限性与替代方案
6.1 争议与批评
-
复杂度高:13种图表学习成本高。
-
敏捷开发中的水土不服:传统UML偏向瀑布模型。
6.2 替代方案
-
SysML:专用于系统工程。
-
BPMN:专注于业务流程建模。
-
C4模型:轻量级架构描述方法。
7. 总结与未来展望
UML仍是软件建模领域的黄金标准,但其应用需结合具体场景灵活裁剪。未来趋势包括:
-
与AI结合:自动生成UML图表或代码。
-
轻量化:在敏捷开发中简化图表类型。
-
云协作:支持多人实时编辑的在线工具。
掌握UML的核心图表(如类图、时序图、用例图)并合理运用工具,可显著提升软件设计的质量与团队协作效率。
相关文章:
UML(统一建模语言)详解:从理论到实践
1. UML概述 1.1 定义与历史背景 统一建模语言(Unified Modeling Language, UML) 是一种标准化的可视化建模语言,用于描述、设计、构造和文档化软件系统。它诞生于1994-1997年,由Grady Booch、James Rumbaugh和Ivar Jacobson&…...
C语言练习题--洛谷P5143攀爬者
题目背景 HKE 考完 GDOI 之后跟他的神犇小伙伴们一起去爬山。 题目描述 他在地形图上标记了 N 个点,每个点 Pi 都有一个坐标 (xi,yi,zi)。所有点对中,高度值 z 不会相等。HKE 准备从最低的点爬到最高的点,他的攀爬满足以下条件&am…...
MySQL常见字段值处理
一、数据拼接 1、CONCAT CONCAT(string1, string2, ..., stringN),将两个或多个字符串连接在一起 自动忽略 NULL 值参数,仅拼接非 NULL 的字符串。 第一个参数必须是分隔符(字符串)。 SELECT CONCAT(Hello, , World); -- 输…...
OpenCV实现图像分割与无缝合并
一、图像分割核心方法 1、阈值分割 #include <opencv2/opencv.hpp> using namespace cv; int main() {Mat img imread("input.jpg", IMREAD_GRAYSCALE);Mat binary;threshold(img, binary, 127, 255, THRESH_BINARY); // 固定阈值分割imwrite("binary.…...
百度之星2023——公园
这道题目用bfs做反而麻烦了。 首先抓题目关键字,要求“最少”,那大概率就是最短路径问题。虽然这题是一个无权图,用bfs也能求最短路径,但是我们知道使用dijkstra是能够利用dist数组持久化最短路径的,相比每次都要bfs&…...
从零搭建微服务项目Pro(第3-1章——本地/OSS图片文件存取)
前言: 在小型demo项目中,一般将图片音频等字节流文件存放本地数据库,但企业级项目中,由于数据量容量有限,需要借助OSS来管理大规模文件。 OSS(对象存储服务,Object Storage Service࿰…...
游戏引擎学习第147天
仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾 具体来说,我们通过隐式计算来解决问题,而不是像数字微分分析器那样逐步增加数据。我们已经涵盖了这个部分,并计划继续处理音量问题。不过,实际上我们现在不需要继续处理…...
Spring boot启动原理及相关组件
优质博文:IT-BLOG-CN 一、Spring Boot应用启动 一个Spring Boot应用的启动通常如下: SpringBootApplication Slf4j public class ApplicationMain {public static void main(String[] args) {ConfigurableApplicationContext ctx SpringApplication.…...
【Linux】信号处理以及补充知识
目录 一、信号被处理的时机: 1、理解: 2、内核态与用户态: 1、概念: 2、重谈地址空间: 3、处理时机: 补充知识: 1、sigaction: 2、函数重入: 3、volatile&…...
微服务——网关、网关登录校验、OpenFeign传递共享信息、Nacos共享配置以及热更新、动态路由
之前学习了Nacos,用于发现并注册、管理项目里所有的微服务,而OpenFeign简化微服务之间的通信,而为了使得前端可以使用微服务项目里的每一个微服务的接口,就应该将所有微服务的接口管理起来方便前端调用,所以有了网关。…...
【leetcode hot 100 19】删除链表的第N个节点
解法一:将ListNode放入ArrayList中,要删除的元素为num list.size()-n。如果num 0则将头节点删除;否则利用num-1个元素的next删除第num个元素。 /*** Definition for singly-linked list.* public class ListNode {* int val;* Lis…...
comctl32!ListView_OnSetItem函数分析LISTSUBITEM结构中的image表示图标位置
第一部分: BOOL ListView_SetSubItem(LV* plv, const LV_ITEM* plvi) { LISTSUBITEM lsi; BOOL fChanged FALSE; int i; int idpa; HDPA hdpa; if (plvi->mask & ~(LVIF_DI_SETITEM | LVIF_TEXT | LVIF_IMAGE | LVIF_STATE)) { …...
数据结构——多项式问题(顺序存储结构or链式存储结构)
补充:malloc函数: malloc 函数是 C 语言标准库中的一个重要函数,位于 <stdlib.h> 头文件中,主要用于在程序运行时动态分配内存。以下将详细介绍其用法。 前面的返回值指针可以自己定义,如 (int*&am…...
【学习方法】技术开发者的提问智慧:如何高效获得解答?
技术开发者的提问智慧:如何高效获得解答? 在技术开发过程中,每个人都会遇到无法解决的问题。此时,我们通常会向团队、社区或论坛求助。然而,为什么有些人的问题能迅速得到解答,而有些人的问题却石沉大海&a…...
记录小白使用 Cursor 开发第一个微信小程序(一):注册账号及下载工具(250308)
文章目录 记录小白使用 Cursor 开发第一个微信小程序(一):注册账号及下载工具(250308)一、微信小程序注册摘要1.1 注册流程要点 二、小程序发布流程三、下载工具 记录小白使用 Cursor 开发第一个微信小程序(…...
vue2项目修改浏览器显示的网页图标
1.准备一个新的图标文件,通常是. ico格式,也可以是. Png、. Svg等格式 2.将新的图标文件(例如:faviconAt.png)放入项目的public文件夹中。如下图 public文件夹中的所有文件都会在构建时原样复制到最终的输出目录(通常是dist) 3. 修改vue项目…...
spring boot3.4.3+MybatisPlus3.5.5+swagger-ui2.7.0
使用 MyBatis-Plus 操作 books 表。我们将实现以下功能: 创建实体类 Book。 创建 Mapper 接口 BookMapper。 创建 Service 层 BookService 和 BookServiceImpl。 创建 Controller 层 BookController。 配置 MyBatis-Plus 和数据库连接。 1. 项目结构 src ├─…...
【网络安全工程】任务10:三层交换机配置
CSDN 原创主页:不羁https://blog.csdn.net/2303_76492156?typeblog三层交换机是指在OSI(开放系统互连)模型中的第三层网络层提供路由功能的交换机。它不仅具备二层交换机的交换功能,还能实现路由功能,提供更为灵活的网…...
侯捷 C++ 课程学习笔记:C++内存管理机制
内存管理从平地到万丈高楼 内存管理入门(Memory Management 101) 需要具有动态分配并使用memory(存储(器),(计算机的)内存),使用过C标准库的容器࿰…...
JVM常用概念之本地内存跟踪
问题 Java应用启动或者运行过程中报“内存不足!”,我们该怎么办? 基础知识 对于一个在本地机器运行的JVM应用而言,需要足够的内存来存储机器代码、堆元数据、类元数据、内存分析等数据结构,来保证JVM应用的成功启动以及未来平…...
【鸿蒙开发】Hi3861学习笔记- 软件定时器示例
00. 目录 文章目录 00. 目录01. 定时器概述02. 定时器API03. 定时器常用API3.1 osTimerNew3.2 osTimerDelete3.3 osTimerStart3.4 osTimerStop 04. 程序示例05. 附录 01. 定时器概述 软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器,当经过设…...
在Html5中仿Matlab自定义色带生成实践
目录 前言 一、RGB的相关知识 1、RGB的基本原理 2、RGB的数值表示 3、应用场景 二、ColorMap生成实战 1、外部库介绍 2、相关API 3、实例生成 三、总结 前言 在现代网页开发与数据可视化领域,色彩的表现力对于信息传达和视觉体验起着至关重要的作用。色带&…...
贪心算法--
1.柠檬水找零 link:860. 柠檬水找零 - 力扣(LeetCode) code class Solution { public:bool lemonadeChange(vector<int>& bills) {// 贪心算法, 优先花出大面额bill, 尽可能保护小面额billint five 0, ten 0;// 不…...
【学习方法一】
学习方法一 一、通用高效学习法二、学科专项方法三、工具与技术辅助四、习惯与心理策略五、避免常见误区总结六、进阶学习策略七、解决学习痛点八、场景化学习法九、资源与工具推荐十、个性化学习调整十一、长期学习心态十二、常见问题QA十三、应对特殊挑战的学习法十四、健康与…...
k8s启动时calico-kube-controllers与coredns组件一直是pending状态
症状: k8s执行kubectl get po -n kube-system时,以下组件一直>是pending状态: calico-kube-controllerscoredns 当执行 kubectl get po -n kube-system 发现 calico-kube-controllers 和 coredns 一直处于 Pending 状态时,通常…...
ngx_openssl_create_conf
ngx_openssl_create_conf 声明在 src\event\ngx_event_openssl.c static void *ngx_openssl_create_conf(ngx_cycle_t *cycle); 定义在 src\event\ngx_event_openssl.c static void * ngx_openssl_create_conf(ngx_cycle_t *cycle) {ngx_openssl_conf_t *oscf;oscf ngx_…...
如何选择国产串口屏?
目录 1、迪文 2、淘晶驰 3、广州大彩 4、金玺智控 5、欣瑞达 6、富莱新 7、冠显 8、有彩 串口屏,顾名思义,就是通过串口通信接口(如RS232、RS485、TTL UART等)与主控设备进行通信的显示屏。其核心功能是显示信息和接收输入…...
matlab慕课学习3.1
3.1顺序结构程序 于20250306 3.1.1程序和程序设计 程序是用某种计算机能够理解并且能够执行的语言来描述的解决问题的方法和步骤。 3.1.2程序的三种基本结构 1.顺序结构 2.选择结构 3.循环结构 3.1.3脚本文件和函数文件 脚本文件是可在命令行窗口直接执行的文件࿰…...
EB-Cable许可管理系统的功能和特点
在数字化时代,软件许可管理已成为企业日常运营中不可或缺的一部分。EB-Cable许可管理系统作为一款专为电缆管理而设计的软件解决方案,为企业提供了全面、高效且灵活的许可管理功能。本文将详细介绍EB-Cable许可管理系统的功能和特点,帮助您快…...
cesium地图设置3d,2d,2.5d动态切换
通过修改cesium实例vw的scene的显示模式,来切换最终的显示模式。 Cesium.SceneMode总共有四个变量值,分别如下:NameTypeDescriptionMORPHINGnumber在3d与2d之间切换变体 between mode, e.g., 3D to 2D.COLUMBUS_VIEWnumber2.5d模式࿰…...
