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) 继承关系
- 继承关系(也可称泛化关系):用于描述父类(基类)与子类(派生类)之间的关系。 子类继承父类的所有功能,父类所具有的属性、方法,子类应该都有。子类中除了与父类一致的信息以外,还可拥有自己特有的信息。
- 表示方法:使用一个实线+空心三角箭头,从子类指向父类即表示继承
- 示例:鸟类继承抽象动物类
- 代码实现
Console.WriteLine("自己动手试试");
(2) 实现关系
-
实现关系:主要用描述接口和实现类的关系。 接口(包括抽象类)是方法的集合,在实现关系中,类实现了接口,类中的方法实现了接口声明的所有方法。
-
表示方法:使用一个虚线+空心三角箭头,从实例指向接口即表示一个实现
-
示例:大雁实现了飞翔接口。
-
代码实现
Console.WriteLine("自己动手试试");
2. 关联
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。关联包含3种关系:聚合、组合、关联。
关联表达了has a的关系模型,当A拥有一个B的时候,就是关联关系
(1) 聚合关系
-
聚合关系:描述整体和部分的关系,整体与部分可以分开。
- 表示一种弱的‘拥有’关系,即has a的关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。 两个对象具有各自的生命周期。
- 聚合关系也表示类之间整体与部分的关系,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。
-
表示方法:使用一个实线+空心菱形箭头,从整体指向局部即表示一个聚合
-
示例:每一只大雁都属于一个大雁群,一个大雁群可以有多只大雁。当大雁死去后大雁群并不会消失,两个对象生命周期不同。
注意:聚合关系只是将一些对象聚集在一起,但他们的关联是相对较弱的,也就是说,局部对象是可以脱离整体对象而单独存在的 -
代码实现
Console.WriteLine("自己动手试试");
(2) 组合关系
-
组合关系:描述整体与部分的关系,但是整体与部分不可以分开。
- 组合是一种强的‘拥有’关系,是一种contains-a的关系,体现了严格的部分和整体关系,部分和整体的生命周期一样。
- 组合关系表示类之间整体与部分的关系,整体和部分有一致的生存期。一旦整体对象不存在,部分对象也将不存在,是同生共死的关系。
-
表示方法:使用一个实线+实心菱形箭头,从整体指向局部即表示一个组合
-
示例:鸟和翅膀就是组合关系,因为它们是部分和整体的关系,并且翅膀和鸟的生命周期是相同的。
注意:组合又叫合成,顾名思义是有局部合起来才成为了一个整体,他们是密不可分的,他们是强关联关系,局部脱离了整体就不存在了 -
代码实现
Console.WriteLine("自己动手试试");
(3) 关联关系
- 关联关系:表示一个类的属性保存了对另一个类的一个实例(或多个实例)的引用。
- 对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。
- 关联关系是类与类之间最常用的一种关系,表示一类对象与另一类对象之间有联系。
- 关联关系有四种:双向关联、单向关联、自关联、多重数关联。
- 在UML图中,双向的关联可以有两个箭头或者没有箭头,单向的关联或自关联有一个箭头。
- 表示方法:使用一个实线箭头,从拥有者指向被拥有者。
- 示例:企鹅需要‘知道’气候的变化,需要‘了解’气候规律。当一个类‘知道’另一个类时,可以用关联。
当一个关系明显是has a的拥有关系,但不像聚合也不像组合那样来描述整体与局部的时候,就应该考虑使用关联关系来描述。组合、聚合也属于关联关系,只是关联关系的类间关系比其他两种要弱。
- 代码实现
Console.WriteLine("自己动手试试");
3. 依赖
对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。依赖包含了1种关系:依赖。
依赖表达了use a的关系模型,当A使用了一个B的时候,就是依赖关系
(1) 依赖关系
-
依赖关系:假设A类的变化引起了B类的变化,则说名B类依赖于A类。
- 大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
- 依赖关系是一种“使用”关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。
-
表示方法:使用一个虚线箭头,从使用者指向被使用者。
-
示例:动物依赖氧气和水。调用新陈代谢方法需要氧气类与水类的实例作为参数(表达了一个物体需要通过另一个物体来完成工作,但他们之间没有包含的关系)
这里的动物,有一个新陈代谢的功能,要工作则必须有空气和水,因此构成了他们之间的依赖关系。特别的,这里的依赖不同于我们上面关联的概念,在企鹅与气候的关系中,企鹅的生存方式依赖于气候的变化,但他们不是依赖关系,因为企鹅不需要气候作为参数进行某项工作,如果企鹅有一个功能是迁徙,需要传入一个气候,此时就是依赖关系了。 -
代码实现
Console.WriteLine("自己动手试试");
4. 小结
- 从关系角度总结:
- 继承(泛化)、实现(实现)这两种关系比较简单,它们体现的是一种基类与实现类、或者接口与实现类之间的纵向关系。
- 聚合、组合、关联、依赖四种关系则体现的是类与类、或者类与接口之间的引用/横向关系。这四种关系所表现的强弱程度来看,从强到弱依次为:组合>聚合>关联>依赖。
- 组合、聚合、关联这三种类关系的代码结构一样,都是用属性来保存另一个类的引用,所以要通过内容间的关系来区别。
- 从图示角度总结:
- 继承、实现都是空心三角箭头,指向class是实线、指向interface则是虚线
- 通过上面聚合,组合,关联三种关系图示对比,所有的关联关系都是实线箭头,只是聚合(相对组合关系弱)用了一个空心菱形,而组合(强)用了一个实心菱形。
- 只有依赖是虚线箭头
- 从代码角度总结:
- 继承和实现,只是通过:(冒号)进行一个继承或实现
- 聚合,组合,关联主要体现为成员变量,A类作为B类的一个成员变量存在
- 依赖主要表现为某个类的方法使用另一个类的对象作为参数。
四、类图绘制实操
五、扩展
VisualStudio 类设计器 组件的使用
总结
以上就是今天要讲的内容,本文介绍了UML图,希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。
参考资料
UML详解(1):类的关系与如何绘制类图
UML类图详解及类图设计
UML类图介绍以及关系详解
UML类图详解
VisualStudio 如何使用UML呢
UML一一 类图关系 (泛化、实现、依赖、关联、聚合、组合)
相关文章:
UML类图 详解
总目录 前言 作为一个程序员,我们经常会使用UML来绘制各种图(UML中定义了用例图、类图、时序图、协作图等九种),类图就是其中常用图之一。设计模式中经常会用到的是类图,本文主要是学习UML类图相关资料后的汇总笔记&a…...
【IEEE出版 | 高录用率 | 快速检索 | 有ISBN号!】2024年智能计算与数据挖掘国际学术会议 (ICDM 2024,9月20-22)
智能计算与数据挖掘是当今信息技术领域的研究热点,并在众多领域都有着广泛的应用,如金融、医疗、教育、交通等。随着大数据时代数据量爆炸式增长,如何从海量数据中提取有价值的信息,一直是需要迭代解决的问题。 2024年智能计算与…...
DaoCloud配置不同环境的流水线(Q)
在DaoCloud自动化部署时,不知道如何分别构建生产,测试环境镜像。 Dockfile文件里有 ARG BUILD_ENV"uat" RUN npm run build:${BUILD_ENV} 这样两行代码来区分环境打包的,ARG是用于指定传递给构建运行时的变量,可是…...
基础的Shell命令
Shell命令有很多,以下是一些常用的Shell命令及其简要说明: 1. cd: 切换当前工作目录。 2. ls: 列出目录内容。 3. pwd: 显示当前工作目录的路径。 4. mkdir: 创建新目录。 5. rm: 删除文件或目录。 6. cp: 复制文件或目录。 7. mv: 移动文件或目录…...
量子仿真speedUp的经验
不用CPU的话,好的电脑配置对于jax的编译会更快 GPU编译速度明显最快...
电测量数据交换DLMS∕COSEM组件第61部分:对象标识系统(OBIS)(下)
GB/T 17215.6的本部分规定了对象标识系统(OBIS)的总体结构并将测量设备中的所有常用数据项映射到其标识代码。OBIS为测量设备中的所有数据都提供唯一的标识符,不仅包括测量值,而且还包括仪表设备的配置或获取测量设备运行状态的抽象数据。 5.抽象对象(A=0) 5.1通用和服…...
【Java】重生之String类再爱我一次---练习题(012)
目录 ♦️练习一:用户登录 ♦️练习二:遍历字符串 ♦️练习三:统计字符次数数 ♦️练习四:拼接字符串 ♦️练习五:反转字符串 ♦️练习六:金额转换 ♦️练习七:手机号屏蔽 ♦️练习一&am…...
NSSCTF-GDOUCTF 2023新生赛
[GDOUCTF 2023]hate eat snake 考察:js代码审计 打开题目,发现需要坚持60秒,那么简单的一个思路就是修改得分的变量>60即可 办法1:修改变量 右键查看源代码,之后发现有一个snake.js的文件,ctrlf搜索i…...
论文解析——Character Region Awareness for Text Detection,字符级文本检测CRAFT算法
这篇论文来自CVPR2019,paper地址:Character Region Awareness for Text Detection。 代码:CRAFT-pytorch。 这篇论文主要解决之前的文本检测是基于word-level的检测框,不能识别任意形状的文本的问题。与之前的方法不同࿰…...
基于飞腾平台的Kafka移植与安装
【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适…...
【Python数据结构与算法】递归----算24
题目:算24 描述 给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。 这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定…...
TOSHIBA东芝代理商--芯智雲城,提供订货、报价、选型等服务!
关于东芝 东芝创立于1875年7月,是日本大型半导体制造商,全球知名的综合机电制造商和解决方案提供者,世界大型综合电子电器企业集团。东芝集团原名东京芝浦电气株式会社,在1939年东京电器与芝浦制作所正式合并成为现在的东芝&…...
sdwan
分支互联网络解决方案 - 华为企业业务 分支互联网络解决方案 随着5G、AI、物联网等新兴技术与云紧密结合,企业业务智能化和云化加速。 企业分支WAN流量激增,传统以MPLS专线为主的广域互联网络难以支撑业务发展。SD-WAN成为应对云时代的必然选择。 SD…...
Linux: network: 建立socket以及设置nonblock/opt所需的时间
最近在扩大socket数量的时候发现程序在完成所有的socket创建设置的时间不短。单线程下。 创建socket的步骤是,(调用glibc/system call的接口): socket bind fcntl (sock, F_SETFL, flags); setsockopt 通过测试发现这几个步骤前后…...
git使用及代码规范
参考链接 git flow 简介代码审核的典型问题gitlab工作流...
职业教育大数据实验实训室建设应用案例
大数据作为一种重要的信息技术,对各行各业产生了深远的影响。职业教育作为培养应用型人才的摇篮,建设大数据实验实训室,对于提高学生的数据分析能力和解决实际问题的能力具有重要意义。唯众作为一家专注于教育技术领域的企业,凭借…...
【Academy】反序列化漏洞Insecure deserialization
反序列化漏洞Insecure deserialization 什么是序列化?序列化与反序列化什么是不安全的反序列化?不安全的反序列化漏洞是如何产生的?不安全的反序列化有什么影响?识别不安全的反序列化漏洞PHP序列化格式Java序列化格式 利用不安全的…...
【轨物推荐】康波、世界体系与创新范式:中国如何引爆新一轮产业革命
原创 邵宇、陈达飞 新财富 2019年12月31日 22:13 中美关系近两年备受关注,在诸多方面各方都已经形成了共识,但竞争博弈的结局富有争议性。当靠事物太近的时候,反而很难看清楚其面貌,使用康德拉季耶夫周期(简称“康波”…...
[HCTF 2018]admin1
打开题目 尝试登陆 admin,123,直接试出来了 有投机取巧的成分,到github查看源码,也能找到用户名密码...
【Qwen-Audio部署实战】Qwen-Audio-Chat模型之对话机器人部署测试
系列篇章💥 No.文章1【Qwen部署实战】探索Qwen-7B-Chat:阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验:用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B:通过FastApi框架实现API的部署与调用4【Q…...
第一百八十五节 Java XML教程 - Java DOM简介
Java XML教程 - Java DOM简介 DOM是标准的树结构,其中每个节点包含来自XML结构的一个组件。 XML文档中两种最常见的节点类型是元素节点和文本节点。 使用Java DOM API,我们可以创建节点,删除节点,更改其内容,并遍历节…...
一款功能强大且免费的图片查看和管理工具
XnView MP是一款功能强大且免费的图片查看和管理工具,支持多种平台(Windows、Mac和Linux),并基于相同的源代码实现统一的用户界面和体验。它不仅能够查看各种图片格式,还提供了丰富的编辑和管理功能。 图片查看与浏览…...
动手学强化学习 第 11 章 TRPO 算法(TRPOContinuous) 训练代码
基于 Hands-on-RL/第11章-TRPO算法.ipynb at main boyu-ai/Hands-on-RL GitHub 理论 TRPO 算法 修改了警告和报错 运行环境 Debian GNU/Linux 12 Python 3.9.19 torch 2.0.1 gym 0.26.2 运行代码 TRPOContinuous.py #!/usr/bin/env pythonimport torch import numpy a…...
数量关系模块
三年后指的不是现在 选A注意单位 注意单位换算 A 正方形减去扇形 256-X5y 那么小李拿的一定是末尾是1或者是6,所以小李拿的是26,那么y46,那么小王或者小周拿的是92,所以选择三个数之和等于92的,所以选择D 分数 百分数 …...
滑模面、趋近律设计过程详解(滑模控制)
目录 1. 确定系统的状态变量和目标2. 定义滑模面3. 选择滑模面的参数4. 设计控制律5. 验证滑模面设计6. 总结 设计滑模面(Sliding Surface)是滑模控制(Sliding Mode Control,SMC)中的关键步骤。滑模控制是一种鲁棒控制…...
SQL Server 端口配置
目录 默认端口 更改端口 示例:更改 TCP 端口 示例:验证端口设置 远程连接测试 示例:使用 telnet 测试连接 配置防火墙 示例:Windows 防火墙设置 远程连接测试 示例:使用 telnet 测试连接 默认端口 TCP/IP: …...
同一窗口还是新窗口打开链接更利于SEO优化
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…...
kafka 安装
docker安装kafka(KRaft 模式) KRaft模式不再对Zookeeper依赖。 docker run -d --name kafka-kraft \-p 9092:9092 -p 9093:9093 \-e KAFKA_PROCESS_ROLESbroker,controller \-e KAFKA_NODE_ID1 \-e KAFKA_CONTROLLER_QUORUM_VOTERS1127.0.0.1:9093 \-e KAFKA_LISTENERSPLAINTEX…...
消息队列中间件 - Kafka:高效数据流处理的引擎
作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有疑问和建议,请私信或评论留言! 前言 在现代大数据和…...
el-table表格动态合并相同数据单元格(可指定列+自定义合并)
el-table表格动态合并相同数据单元格(可指定列自定义合并)_el-table 合并单元格动态-CSDN博客 vue2elementUI表格实现实现多列动态合并_element table动态合并列-CSDN博客...
wordpress 中国/最有效的恶意点击软件
1 class A 2 {3 private:4 int a, b;5 public:6 //A ob1; //这个地方会产生个error:不能使用正在定义的“A”类定义对象7 A* ob; //相比而言,正在定义的类可以用来声明对象的指针变量,8 9 A() //默认构造函数…...
html制作爱心代码/kj6699的seo综合查询
目录 一、注解用法 二、实例分析 三、源码追踪 四、总结 一、注解用法 【1】Scope注解 Scope注解是用来控制实例作用域的,单实例还是多实例,该注解可以作用在类和方法上面,通过属性来控制作用域,如下: prototyp…...
合肥网站建设搜王道下拉/seo网站优化技术
rabbitmq实现延迟消息的方案 1. 使用延时队列 单机不考虑拓展的情况下,可以使用java.util.concurrent包的DelayQueue, 但插入的对象需实现Delayed接口,并实现其getDelay方法。 优点:针对任意消息队列均可使用 缺点:可拓展性差&a…...
上海网站建设最好的公司/公司网站的推广方案
Toggle就是开关的意思,ToggleButton就是一个开关按钮组件,在BB10 Cascades中可以在QML中直接加入一个ToggleButton来作为开关,该该控件显示出来是这个样子的: 如果是选中状态,或者说是“打开”状态显示出来是这个样子的…...
网站制作免费软件/ciliba磁力搜索引擎
来博客园写WF主题博客已经3年了, 在园子里认识了很多朋友,也学了很多知识.看到园子现在的气氛不太好,我很着急,但唯一能做的就是写点技术文章以感谢博客园为我们提供这么好的交流环境 从WinFX到NET3.x再到NET4.0 ,WPF,WCF,WF 始终是放在一起的,WPF(silverlight)用于程序UI的展现…...
门户网站英文版建设/站长工具 站长之家
电容屏驱动调试先了解Linux电容屏驱动中几个常用的概念:中断下半部-工作队列; input机制; Linux与Android 多点触摸协议。一、中断下半部-工作队列 1、中断 先看一下宋宝华先生的《Linux设备驱动开发详解》里面…...