当前位置: 首页 > news >正文

UML类图 详解

总目录


前言

作为一个程序员,我们经常会使用UML来绘制各种图(UML中定义了用例图、类图、时序图、协作图等九种),类图就是其中常用图之一。设计模式中经常会用到的是类图,本文主要是学习UML类图相关资料后的汇总笔记,也是作为设计模式系列文章中“前菜”。


一、基本介绍

1.什么是UML

(1) 基本介绍

  • Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是一种用于软件系统分析和设计的语言
  • UML是一个支持模型化和软件系统开发的图形化语言为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置。
  • UML作为一种模型语言,它使开发人员专注于建立产品的模型和结构,而不是选用什么程序语言和算法实现。当模型建立之后,模型可以被UML工具转化成指定的程序语言代码。

UML规范用来描述建模的概念有,类(对象的)、对象、关联、职责、行为、接口、用例、包、顺序、协作,以及状态。


通俗理解: UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个对象和对象之间的关系,比如类、接口、实现、泛化、依赖、组合、聚合等

(2) UML分类

UML图分类:

  • 用例图(use case)
  • 静态结构图: 类图、对象图、包图、组件图、部署图
  • 动态行为图:交互图(时序图与协作图)、状态图、活动图
  • 类图是描述类与类之间的关系的,是UML图中最核心的

2.什么是UML类图

画UML图与写文章差不多,都是把自己的思路描述给别人看。UML类图就是负责描述软件系统中对象以及对象间的关系的架构图,可让我们从更高的角度熟悉系统。

UML类图是一种结构图,用于描述一个系统的静态结构。类图以反映类结构和类之间关系为目的,用以描述软件系统的结构,是一种静态建模方法。类图中的类,与面向对象语言中的类的概念是对应的。

在系统设计阶段,类图直接引导面向对象的编程语言实现类。类图是生成代码的核心要图。如果类图设计得好,整个系统的代码框架可以有类图自动生成,大大简化了系统编码所耗费的时间。因此,我们进一步利用类图,使得代码的编写编程一种自动化工作,而整个信息系统的建设中心都可以集中到分析设计上来。

类图是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。类图主要是用来显示系统中的接口以及它们之间的静态结构关系的一种静态模型。

3.绘制UML工具

网页版:https://www.processon.com/
软件版:PowerDesigner(个人使用)、UMLet、Visio、StartUML

二、类图解析

1. 如何表示一个类

通过UML工具(ProcessOn)拖动一个表示“类”的图形,显示如下:
在这里插入图片描述
在类的UML图中,使用长方形描述一个类的主要构成,长方形垂直地分为三层,以此放置类的名称、属性和方法。

行数代表内容格式
第一行表示类的名字仅名字
第二行表示类的属性可见性 名称 :类型 [ = 默认值]
第三行表示类的方法可见性 名称(参数列表) [ : 返回类型]

注意:属性和方法都要标上可见性:

符号代表内容
+public
-private
#protected
~default,也就是包权限
_下划线表示static
斜体表示抽象

2.如何表示抽象类

其中,一般类的类名用正常字体粗体表示;抽象类名用斜体字粗体

3.如何表示接口

通过UML工具(ProcessOn)拖动一个表示“接口”的图形,显示如下:
在这里插入图片描述

行数代表内容格式
第一行表示接口的名字明确写上<<接口>>的标识,然后换行写下接口名
第二行表示接口的方法可见性 名称(参数列表) [ : 返回类型]

4.其他图表示

除了以上图示之外,我们可能会在UML绘制里还能找到以下几种:简单类、多例类、活动类等,这些在类图中并不常用,一般如果一个类只有方法没有属性,则第二行空着即可。

在这里插入图片描述

此外,常见的还有一种对象,那就是上图表示的注释。

三、类关系

表示类的关系总共有6种,这6种又可以分为3类。

  • 泛化:继承、实现
  • 关联:聚合、组合、 关联
  • 依赖 :依赖

六种关系的箭头表示如下图所示:
在这里插入图片描述

1. 泛化

泛化 表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。泛化包括继承和实现两种关系

泛化表达了is a的关系模型,当A以某种形式是一个B的时候,就是泛化关系

(1) 继承关系

在这里插入图片描述

  1. 继承关系(也可称泛化关系):用于描述父类(基类)与子类(派生类)之间的关系。 子类继承父类的所有功能,父类所具有的属性、方法,子类应该都有。子类中除了与父类一致的信息以外,还可拥有自己特有的信息。
  2. 表示方法:使用一个实线+空心三角箭头,从子类指向父类即表示继承
  3. 示例:鸟类继承抽象动物类
    在这里插入图片描述
  4. 代码实现
		Console.WriteLine("自己动手试试");

(2) 实现关系

在这里插入图片描述

  1. 实现关系:主要用描述接口和实现类的关系。 接口(包括抽象类)是方法的集合,在实现关系中,类实现了接口,类中的方法实现了接口声明的所有方法。

  2. 表示方法:使用一个虚线+空心三角箭头,从实例指向接口即表示一个实现

  3. 示例:大雁实现了飞翔接口。
    在这里插入图片描述

  4. 代码实现

		Console.WriteLine("自己动手试试");

2. 关联

对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。关联包含3种关系:聚合、组合、关联。

关联表达了has a的关系模型,当A拥有一个B的时候,就是关联关系

(1) 聚合关系

在这里插入图片描述

  1. 聚合关系:描述整体和部分的关系,整体与部分可以分开。

    • 表示一种弱的‘拥有’关系,即has a的关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。 两个对象具有各自的生命周期。
    • 聚合关系也表示类之间整体与部分的关系,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。
  2. 表示方法:使用一个实线+空心菱形箭头,从整体指向局部即表示一个聚合

  3. 示例:每一只大雁都属于一个大雁群,一个大雁群可以有多只大雁。当大雁死去后大雁群并不会消失,两个对象生命周期不同。
    在这里插入图片描述
    注意:聚合关系只是将一些对象聚集在一起,但他们的关联是相对较弱的,也就是说,局部对象是可以脱离整体对象而单独存在的

  4. 代码实现

		Console.WriteLine("自己动手试试");

(2) 组合关系

在这里插入图片描述

  1. 组合关系:描述整体与部分的关系,但是整体与部分不可以分开。

    • 组合是一种强的‘拥有’关系,是一种contains-a的关系,体现了严格的部分和整体关系,部分和整体的生命周期一样。
    • 组合关系表示类之间整体与部分的关系,整体和部分有一致的生存期。一旦整体对象不存在,部分对象也将不存在,是同生共死的关系。
  2. 表示方法:使用一个实线+实心菱形箭头,从整体指向局部即表示一个组合

  3. 示例:鸟和翅膀就是组合关系,因为它们是部分和整体的关系,并且翅膀和鸟的生命周期是相同的。
    在这里插入图片描述
    注意:组合又叫合成,顾名思义是有局部合起来才成为了一个整体,他们是密不可分的,他们是强关联关系,局部脱离了整体就不存在了

  4. 代码实现

		Console.WriteLine("自己动手试试");

(3) 关联关系

在这里插入图片描述

  1. 关联关系:表示一个类的属性保存了对另一个类的一个实例(或多个实例)的引用。
    • 对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。
    • 关联关系是类与类之间最常用的一种关系,表示一类对象与另一类对象之间有联系。
    • 关联关系有四种:双向关联、单向关联、自关联、多重数关联。
    • 在UML图中,双向的关联可以有两个箭头或者没有箭头,单向的关联或自关联有一个箭头。
  2. 表示方法:使用一个实线箭头,从拥有者指向被拥有者。
  3. 示例:企鹅需要‘知道’气候的变化,需要‘了解’气候规律。当一个类‘知道’另一个类时,可以用关联。
    在这里插入图片描述

当一个关系明显是has a的拥有关系,但不像聚合也不像组合那样来描述整体与局部的时候,就应该考虑使用关联关系来描述。组合、聚合也属于关联关系,只是关联关系的类间关系比其他两种要弱。

  1. 代码实现
		Console.WriteLine("自己动手试试");

3. 依赖

对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。依赖包含了1种关系:依赖。

依赖表达了use a的关系模型,当A使用了一个B的时候,就是依赖关系

(1) 依赖关系

在这里插入图片描述

  1. 依赖关系:假设A类的变化引起了B类的变化,则说名B类依赖于A类。

    • 大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
    • 依赖关系是一种“使用”关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。
  2. 表示方法:使用一个虚线箭头,从使用者指向被使用者。

  3. 示例:动物依赖氧气和水。调用新陈代谢方法需要氧气类与水类的实例作为参数(表达了一个物体需要通过另一个物体来完成工作,但他们之间没有包含的关系)
    在这里插入图片描述
    这里的动物,有一个新陈代谢的功能,要工作则必须有空气和水,因此构成了他们之间的依赖关系。特别的,这里的依赖不同于我们上面关联的概念,在企鹅与气候的关系中,企鹅的生存方式依赖于气候的变化,但他们不是依赖关系,因为企鹅不需要气候作为参数进行某项工作,如果企鹅有一个功能是迁徙,需要传入一个气候,此时就是依赖关系了。

  4. 代码实现

		Console.WriteLine("自己动手试试");

4. 小结

  • 从关系角度总结:
    • 继承(泛化)、实现(实现)这两种关系比较简单,它们体现的是一种基类与实现类、或者接口与实现类之间的纵向关系。
    • 聚合、组合、关联、依赖四种关系则体现的是类与类、或者类与接口之间的引用/横向关系。这四种关系所表现的强弱程度来看,从强到弱依次为:组合>聚合>关联>依赖。
    • 组合、聚合、关联这三种类关系的代码结构一样,都是用属性来保存另一个类的引用,所以要通过内容间的关系来区别。
  • 从图示角度总结:
    • 继承、实现都是空心三角箭头,指向class是实线、指向interface则是虚线
    • 通过上面聚合,组合,关联三种关系图示对比,所有的关联关系都是实线箭头,只是聚合(相对组合关系弱)用了一个空心菱形,而组合(强)用了一个实心菱形。
    • 只有依赖是虚线箭头
  • 从代码角度总结:
    • 继承和实现,只是通过:(冒号)进行一个继承或实现
    • 聚合,组合,关联主要体现为成员变量,A类作为B类的一个成员变量存在
    • 依赖主要表现为某个类的方法使用另一个类的对象作为参数。

四、类图绘制实操

在这里插入图片描述

五、扩展

VisualStudio 类设计器 组件的使用


总结

以上就是今天要讲的内容,本文介绍了UML图,希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。


参考资料
UML详解(1):类的关系与如何绘制类图
UML类图详解及类图设计
UML类图介绍以及关系详解
UML类图详解
VisualStudio 如何使用UML呢
UML一一 类图关系 (泛化、实现、依赖、关联、聚合、组合)

相关文章:

UML类图 详解

总目录 前言 作为一个程序员&#xff0c;我们经常会使用UML来绘制各种图&#xff08;UML中定义了用例图、类图、时序图、协作图等九种&#xff09;&#xff0c;类图就是其中常用图之一。设计模式中经常会用到的是类图&#xff0c;本文主要是学习UML类图相关资料后的汇总笔记&a…...

【IEEE出版 | 高录用率 | 快速检索 | 有ISBN号!】2024年智能计算与数据挖掘国际学术会议 (ICDM 2024,9月20-22)

智能计算与数据挖掘是当今信息技术领域的研究热点&#xff0c;并在众多领域都有着广泛的应用&#xff0c;如金融、医疗、教育、交通等。随着大数据时代数据量爆炸式增长&#xff0c;如何从海量数据中提取有价值的信息&#xff0c;一直是需要迭代解决的问题。 2024年智能计算与…...

DaoCloud配置不同环境的流水线(Q)

在DaoCloud自动化部署时&#xff0c;不知道如何分别构建生产&#xff0c;测试环境镜像。 Dockfile文件里有 ARG BUILD_ENV"uat" RUN npm run build:${BUILD_ENV} 这样两行代码来区分环境打包的&#xff0c;ARG是用于指定传递给构建运行时的变量&#xff0c;可是…...

基础的Shell命令

Shell命令有很多&#xff0c;以下是一些常用的Shell命令及其简要说明&#xff1a; 1. cd: 切换当前工作目录。 2. ls: 列出目录内容。 3. pwd: 显示当前工作目录的路径。 4. mkdir: 创建新目录。 5. rm: 删除文件或目录。 6. cp: 复制文件或目录。 7. mv: 移动文件或目录…...

量子仿真speedUp的经验

不用CPU的话&#xff0c;好的电脑配置对于jax的编译会更快 GPU编译速度明显最快...

电测量数据交换DLMS∕COSEM组件第61部分:对象标识系统(OBIS)(下)

GB/T 17215.6的本部分规定了对象标识系统(OBIS)的总体结构并将测量设备中的所有常用数据项映射到其标识代码。OBIS为测量设备中的所有数据都提供唯一的标识符,不仅包括测量值,而且还包括仪表设备的配置或获取测量设备运行状态的抽象数据。 5.抽象对象(A=0) 5.1通用和服…...

【Java】重生之String类再爱我一次---练习题(012)

目录 ♦️练习一&#xff1a;用户登录 ♦️练习二&#xff1a;遍历字符串 ♦️练习三&#xff1a;统计字符次数数 ♦️练习四&#xff1a;拼接字符串 ♦️练习五&#xff1a;反转字符串 ♦️练习六&#xff1a;金额转换 ♦️练习七&#xff1a;手机号屏蔽 ♦️练习一&am…...

NSSCTF-GDOUCTF 2023新生赛

[GDOUCTF 2023]hate eat snake 考察&#xff1a;js代码审计 打开题目&#xff0c;发现需要坚持60秒&#xff0c;那么简单的一个思路就是修改得分的变量>60即可 办法1&#xff1a;修改变量 右键查看源代码&#xff0c;之后发现有一个snake.js的文件&#xff0c;ctrlf搜索i…...

论文解析——Character Region Awareness for Text Detection,字符级文本检测CRAFT算法

这篇论文来自CVPR2019&#xff0c;paper地址&#xff1a;Character Region Awareness for Text Detection。 代码&#xff1a;CRAFT-pytorch。 这篇论文主要解决之前的文本检测是基于word-level的检测框&#xff0c;不能识别任意形状的文本的问题。与之前的方法不同&#xff0…...

基于飞腾平台的Kafka移植与安装

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…...

【Python数据结构与算法】递归----算24

题目&#xff1a;算24 描述 给出4个小于10个正整数&#xff0c;你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是&#xff0c;是否存在一种方式使得得到的表达式的结果等于24。 这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定…...

TOSHIBA东芝代理商--芯智雲城,提供订货、报价、选型等服务!

关于东芝 东芝创立于1875年7月&#xff0c;是日本大型半导体制造商&#xff0c;全球知名的综合机电制造商和解决方案提供者&#xff0c;世界大型综合电子电器企业集团。东芝集团原名东京芝浦电气株式会社&#xff0c;在1939年东京电器与芝浦制作所正式合并成为现在的东芝&…...

sdwan

分支互联网络解决方案 - 华为企业业务 分支互联网络解决方案 随着5G、AI、物联网等新兴技术与云紧密结合&#xff0c;企业业务智能化和云化加速。 企业分支WAN流量激增&#xff0c;传统以MPLS专线为主的广域互联网络难以支撑业务发展。SD-WAN成为应对云时代的必然选择。 SD…...

Linux: network: 建立socket以及设置nonblock/opt所需的时间

最近在扩大socket数量的时候发现程序在完成所有的socket创建设置的时间不短。单线程下。 创建socket的步骤是&#xff0c;&#xff08;调用glibc/system call的接口&#xff09;&#xff1a; socket bind fcntl (sock, F_SETFL, flags); setsockopt 通过测试发现这几个步骤前后…...

git使用及代码规范

参考链接 git flow 简介代码审核的典型问题gitlab工作流...

职业教育大数据实验实训室建设应用案例

大数据作为一种重要的信息技术&#xff0c;对各行各业产生了深远的影响。职业教育作为培养应用型人才的摇篮&#xff0c;建设大数据实验实训室&#xff0c;对于提高学生的数据分析能力和解决实际问题的能力具有重要意义。唯众作为一家专注于教育技术领域的企业&#xff0c;凭借…...

【Academy】反序列化漏洞Insecure deserialization

反序列化漏洞Insecure deserialization 什么是序列化&#xff1f;序列化与反序列化什么是不安全的反序列化&#xff1f;不安全的反序列化漏洞是如何产生的&#xff1f;不安全的反序列化有什么影响&#xff1f;识别不安全的反序列化漏洞PHP序列化格式Java序列化格式 利用不安全的…...

【轨物推荐】康波、世界体系与创新范式:中国如何引爆新一轮产业革命

原创 邵宇、陈达飞 新财富 2019年12月31日 22:13 中美关系近两年备受关注&#xff0c;在诸多方面各方都已经形成了共识&#xff0c;但竞争博弈的结局富有争议性。当靠事物太近的时候&#xff0c;反而很难看清楚其面貌&#xff0c;使用康德拉季耶夫周期&#xff08;简称“康波”…...

[HCTF 2018]admin1

打开题目 尝试登陆 admin&#xff0c;123&#xff0c;直接试出来了 有投机取巧的成分&#xff0c;到github查看源码&#xff0c;也能找到用户名密码...

【Qwen-Audio部署实战】Qwen-Audio-Chat模型之对话机器人部署测试

系列篇章&#x1f4a5; No.文章1【Qwen部署实战】探索Qwen-7B-Chat&#xff1a;阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验&#xff1a;用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B&#xff1a;通过FastApi框架实现API的部署与调用4【Q…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...