UML的概念和主图学习

UML的概念和主图学习

UML包含了大量用于面向对象系统建模和开发的符号,可以图形化的建模分析模型元素间的行为。

用例图

用例图:描述了人们希望一个系统应该提供怎样的服务给自己使用,将系统参与方、功能服务、及他们间的使用关系更清晰的展示出来,以便使系统用户、系统开发人员和其他参与方更容易理解这些元素的用途,也便于开发人员最终实现这些元素。

包括四方面内容:

用例:是对系统的用户需求(主要是功能需求)的描述,用例表达了系统的功能和所提供的服务,描述了活动者与系统交互中的对话。用椭圆形表示。


参与者 :是系统外部的一个实体,它以某种方式参与了用例的执行过程,在UML中,通常用名字写在下面的人形图标表示。

参与者、用例之间的关系:主要包括关联、泛化、包含、拓展。以连线+描述的方式表示

在 UML 中,实线、虚线、空心箭头、实心箭头代表完全不同的逻辑含义:

关系类型 符号规则 逻辑含义及方向
关联 (Association) 无箭头实线 表示参与者与用例之间存在通信。通常不带箭头,若带箭头则表示启动者 (Initiator)
泛化 (Generalization) 带空心三角形的实线 指向父类。表示"是一种"关系(子用例继承父用例的特性,或子参与者继承父参与者的权限)。
包含 (Include) 带开放箭头的虚线 + <<include>> 指向被包含的用例 。表示基础用例必须调用该包含用例才能完成任务。
扩展 (Extend) 带开放箭头的虚线 + <<extend>> 指向基础用例。表示在特定扩展点(Extension Point)满足时,可选地增强基础用例的功能。
  • 关联:表示参与者与用例之间的关系

  • 泛化:表示参与者与参与者之间、用例与用例之间的关系。一个用例可以被特别列举为一个或多个子用例,这被称为用例泛化。

  • 包含:表示用例与用例之间的关系,其中一个用例的行为包含了另一个用例的场景,另一个用例的行为作为该用例的行为的一部分。
  • 拓展:表示用例与用例之间的关系,拓展用例是在满足一定条件下对基础用例的补充。
  • 系统边界:系统边界是指系统与系统之间的界限。用方形容器+系统名称表示。

类图

class(类)

基本元素:矩形框表示,其中包含三个部分:类名、属性和方法。

Interface(接口)

类似于类的表示方法,但在矩形框顶部会加上<<interface>>标识。

抽象类

在类名处使用斜体字表示,或者在矩形框顶部加上<<abstract>>标识。

类之间的关系

关系类型 符号 代码表现形式 逻辑描述
依赖 (Dependency) 虚线箭头 局部变量、方法参数、静态调用。指向被依赖者 "Use a":临时使用。A 的方法里用到了 B,但 A 不持有 B。
关联 (Association) 实线箭头 成员变量 (属性),指向子类 "Has a":长期持有。A 类里有一个成员变量类型是 B。
聚合 (Aggregation) 空心菱形实线 成员变量(外部注入),指向整体 "Owns a":整体与部分可分离。公司倒闭了,员工还在。
组合 (Composition) 实心菱形实线 成员变量(内部创建),指向整体 "Contains a":同生共死。鸟死了,翅膀也就没了。
实现 (Realization) 虚线空心三角 implements 指向被实现的接口 "Like a":接口契约。规定了必须具备的功能。
继承 (Generalization) 实线空心三角 extends指向父类 "Is a":血缘关系。子类是父类的一种。

以下是一个包含以上各种关系的示例

状态图

状态图,显示一个状态机,属于UML活动图。

UML具有许多不同类型的图表,包括:

  • 静态图:用例图、类图、包图
  • 动态图:活动图、状态图、时序图、协作图

    状态 (State):状态机的核心组成

状态描述了对象在生命周期中,由于动态行为的执行所产生的结果与所处的阶段。根据功能的不同,状态可以分为以下几种类型:

状态类型 图形标识 逻辑含义与用法
初始状态 (Initial) 实心圆形 伪状态(Pseudostate)。表示整个状态图或某个复合状态的默认起点。
最终状态 (Final) 圆圈内嵌实心圆点 伪状态。表示状态机运行的彻底结束。
选择状态 (Choice) 菱形 伪状态。表示条件分支,分支连线上方括号 [...] 内的文字为监护条件。
一般状态 (General) 圆角矩形 系统停留的常规阶段。包含:名称 (顶部标识)、入口/出口动作 (进入或退出时触发的原子动作/动作序列)、内部转换 (语法为事件/动作,触发时不引起状态跳转,也不执行出入口动作)。
复合状态 (Composite) 包含内部状态的矩形 又称组合状态,指内部嵌套了多个子状态的状态。可以将内部结构画在矩形内,也可将细节单独拆分绘制。
历史状态 (History) 圆圈内带有字母 H 伪状态。用于"记忆"。当系统从复合状态退出后再次进入时,可直接恢复到上次中断时的特定子状态,而不是重新从该复合状态的初始状态开始。

转换 (Transition):状态间的流转桥梁

转换是两个状态之间的关联连接,表示对象在第一个状态中执行特定动作,并在满足特定条件时进入下一个状态。

转换要素/类型 核心作用与执行规则
源状态 (Source) 转换的起点。对象处于此状态时,接收事件并尝试激活转换。
目标状态 (Target) 转换的终点。转换完成后,对象所进入的新状态。
触发事件 (Trigger) 引起转换的直接原因,如系统信号、方法调用、时间超时或属性改变。
监护条件 (Guard) 方括号 [...] 括起来的布尔表达式。条件必须为 true 转换才会发生。
结果 (Effect) 状态转移成功后,系统连带执行的动作或产生的结果。
自身转换 (Self) 源状态与目标状态为同一个状态的转换。
外部转换 (External) 在复合状态层级关系中:转换会触发退出并重新进入状态的过程(会执行完整的退出和进入动作)。
本地转换 (Local) 在复合状态层级关系中:转换发生时不跨越当前状态的边界(不会执行源状态的退出动作,或目标状态的进入动作)。

时序图

时序图(Sequence Diagram),又名序列图、循序图,是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。

在画时序图时会涉及7种元素:角色(Actor)、对象(Object)、生命线(LifeLine)、控制焦点(Activation)、消息(Message)、自关联消息、组合片段。其中前6种是比较常用和重要的元素,剩余的一种组合片段元素不是很常用,但是比较复杂。我们先介绍前6种元素,在单独介绍组合片段元素。

元素名称 符号表现形式 逻辑含义
角色 (Actor) 小人图标 系统的外部参与者,可以是人、其他系统或子系统。
对象 (Object) 顶部矩形框 参与交互的实体。命名规范:对象名:类名:匿名类对象名:
生命线 (LifeLine) 对象下方的垂直虚线 代表对象在时间维度上的存在周期(时间线自上而下)。
控制焦点 (Activation) 生命线上的细长矩形 代表对象在某段时间内处于激活状态(正在执行操作)。
消息 (Message) 各种连线与箭头 对象之间通信的载体,分为同步、异步、返回等多种类型。
自关联消息 指向自身的折线箭头 对象内部的方法调用(自己调用自己的另一个方法)。

基础元素只能画"流水账",如果遇到 if-elsefor 循环或多线程并发,就需要用到组合片段(共13种,最常用的有4种)。它用一个大方框把相关的消息包裹起来,并在左上角标明逻辑类型。

片段类型 关键字 代码逻辑映射 逻辑含义
抉择 (Alt) alt if...else if...else 互斥的分支逻辑。只会执行其中一个满足条件的片段。
选项 (Opt) opt 单个 if 可选执行序列。条件满足则执行,不满足则跳过。
循环 (Loop) loop for / while 循环执行序列。只要满足设定的临界条件,片段就会重复执行。
并行 (Par) par 多线程并发 并行处理序列。片段中的事件可以交错并发执行,互不阻塞。

绘图工具简介

工具名称 核心定位 优劣势简评 最佳适用场景
PlantUML 纯代码驱动建模 优势 :完美融入 Git 版本控制;不用管排版,引擎自动布局;修改极其高效。 劣势:无法像画笔一样精准控制线条的拐角和坐标;需要记忆特定语法。 伴随代码库的动态技术文档、开发者日常画图。
Microsoft Visio 通用型图形绘制 优势 :门槛极低,图形库丰富,能画任何图。 劣势:只是"画图",线条之间没有底层逻辑关联,难以维护复杂模型。 汇报演示、网络拓扑图、自由度高的业务概念图。
StarUML 专业级敏捷 UML 建模 优势 :严格遵循 UML 标准,支持正向/反向工程(图与代码互转)。 劣势:仅专注于软件模型,不适合非软件类的流程图。 面向对象系统分析、详细设计阶段的代码结构推演。
PowerDesigner 重量级数据与架构建模 优势 :数据库设计(CDM/PDM)的绝对霸主,自动生成建表 SQL。 劣势:界面古老,过于笨重,学习曲线十分陡峭。 企业级核心数据库设计、复杂业务系统的表结构梳理。
Draw.io 轻量级在线协作绘图 优势 :开源免费,全平台可用,内嵌于各种文档(如 Markdown 笔记)。 劣势:缺乏代码级的语义校验和模型约束。 团队头脑风暴、敏捷开发中的快速白板草图。

本博客部分图用PlantUML制作

end

相关推荐
C羊驼2 小时前
C语言学习笔记(十):操作符
c语言·开发语言·经验分享·笔记·学习
鹭天2 小时前
RAG学习笔记
笔记·学习
arvin_xiaoting2 小时前
OpenClaw学习总结_I_核心架构_6:Compaction详解
学习·系统架构·学习总结·ai agent·compaction·openclaw
存储服务专家StorageExpert2 小时前
NetApp NVME SSD 盘的学习笔记
运维·服务器·笔记·学习·存储维护·emc存储·netapp
无聊大侠hello world2 小时前
黑马大模型 RAG 与 Agent 实战学习笔记
笔记·学习
2501_918126912 小时前
学习所有python写服务器的语句
服务器·人工智能·python·学习·个人开发
承渊政道2 小时前
【优选算法】(实战感悟二分查找算法的思想原理)
c++·笔记·学习·算法·leetcode·visual studio code
Accerlator2 小时前
操作系统学习
学习
m0_564876843 小时前
nano-vllm学习
学习·vllm