一文搞懂 UML 类图
面向对象设计 主要就是使用UML的类图,类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据
一、UML类图简介
统一建模语言 UML (Unified Modeling Language) 类图是一种用于描述系统结构的图形化工具。它以类和对象为基础,主要用于表示系统中的类、接口、继承关系、关联关系等元素,以及它们之间的静态结构和关系。在本文中,将深入介绍UML类图的基本元素、关系类型以及如何创建一个简单而有效的类图。
类图以反映类的结构(属性、操作)以及类之间的关系为主要目的,描述了软件系统的结构,是一种静态建模方法。类图用来描述系统中有意义的概念,包括具体的概念、抽象的概念、实现方面的概念等,是对现实世界中事物的抽象。
类图的主要作用是对系统的词汇进行建模、对简单的协作进行建模和对逻辑数据库模式进行建模。类图显示集合的类,接口,关联,协作和约束,它也被称为作为结构图。
UML类图是在 设计程序之前 画,而不是等写完程序再画!!!
类(Class)、接口(Interface)以及类之间的关系
二、类与类之间的关系
UML中的关系是面向对象关系。如果不以面向对象的思维去考虑会感觉到有很多关系认为是一样的
| 关系 | 说明 | 表示 |
| 继承(泛化) | 继承关系,指向方(符号左)子类,被指向方(符号右)为父类 | ![]() |
| 实现 | 接口的实现关系,指向方(符号左)实现类,被指向方(符号右)为接口类。 | ![]() |
| 组合 | 整体和部分关系,指向方(符号左)整体类,被指向方(符号右)为部分类 | ![]() |
| 聚合 | 整体和部分关系,指向方(符号左)整体类,被指向方(符号右)为部分类 | ![]() |
| 关联 | 是类与类之间的联结,将一个类的对象(被指向方)作为另一个类(指向方)的属性。 | ![]() |
| 依赖 | 使用关系,指向方(符号左)使用类,被指向方(符号右)为被使用类 | ![]() |
2.1 继承
继承 也叫作 泛化(Generalization),用于描述父子类之间的关系,父类又称为 基类 或者 超类,子类又称作 派生类。在UML中,泛化关系用 带空心三角形的实线 来表示
2.2 组合
组合(Composition)关系也表示的是一种整体和部分的关系,但是在组合关系中 整体对象 可以 控制 成员对象的生命周期,一旦整体对象不存在,成员对象也不存在,整体对象和成员对象之间具有 同生共死 的关系。
在UML中组合关系用带 实心菱形的直线 表示,下面举两个组合关系的例子:
- 头(
Head)和 嘴巴(Mouth)、鼻子(Nose)、耳朵(Ear)、眼睛(Eye) - 树(
Tree)和 树根(Root)、树干(Trunk)、树枝(Branch)、树叶(Leaf)
class Engine {public void start() {System.out.println("Engine starting.");}public void stop() {System.out.println("Engine stopping.");}
}class Car {private Engine engine = new Engine();public Car() {// 初始化代码,例如 engine.start()}public void startEngine() {engine.start();}public void stopEngine() {engine.stop();}
}public class CompositionExample {public static void main(String[] args) {Car myCar = new Car();myCar.startEngine();myCar.stopEngine();}
}
2.3 聚合
聚合(Aggregation)关系表示 整体 与 部分 的关系。在聚合关系中,成员对象 是 整体的一部分,但是成员对象可以脱离整体对象独立存在。在UML中,聚合关系用 带空心菱形的直线 表示,下面举两个聚合关系的例子:
汽车(Car)与 引擎(Engine)、轮胎(Wheel)、车灯(Light)
森林(Forest)与 植物(Plant)、动物(Animal)、水(Water)、阳光(Sunshine)
public class Engine {private String model;public Engine(String model) {this.model = model;}// Getter and Setter methodspublic String getModel() {return model;}public void setModel(String model) {this.model = model;}
}public class Car {private Engine engine;public Car(Engine engine) {this.engine = engine;}// Getter and Setter methodspublic Engine getEngine() {return engine;}public void setEngine(Engine engine) {this.engine = engine;}
}public class Main {public static void main(String[] args) {Engine engine = new Engine("V8");Car car = new Car(engine);// 显示汽车的发动机型号System.out.println("Car is using " + car.getEngine().getModel() + " engine.");}
}
2.4 关联关系
关联(Assocition)关系是类与类之间最常见的一种关系,它是一种结构化的关系,表示一个对象与另一个对象之间有联系,如汽车和轮胎、师傅和徒弟、班级和学生等。在UML类图中,用 ( 带接头 或 不带箭头 的)实线 连接有关联关系的类。通常 将一个类的对象 作为 另一个类的成员变量。类之间的关联关系有三种,分别是:单向关联、双向关联、自关联。下面逐一给大家进行介绍
(a) 单向关联
单向关联指的是关联只有一个方向,比如每个孩子(Child)都拥有一个父亲(Parent),其代码实现为
class Parent{};class Child{
private Parent m_father;
}

(b) 双向关联
现实生活中每个孩子都有父母,每个父母同样有自己的孩子,如果想要通过类来描述这样的亲情关系
class Parent {
private Child m_son;
};class Child {
private Parent m_father;
};

或者

(c)自关联
自关联指的就是当前类中 包含一个自身类型的对象成员,这在 链表 中非常常见,单向链表中都会有一个指向自身节点类型的后继指针成员,而双向链表中会包含一个指向自身节点类型的前驱指针和一个指向自身节点类型的后继指针。就以双向链表节点类为例
class Node {
private int m_data = 0;
private Node m_prev;
private Node m_next;
};

一般使用 带箭头的实线 来描述自关联关系,我中有我,独角戏。
2.5 依赖关系
依赖(Dependency)关系是一种 使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系,大多数情况下依赖关系体现在某个类的方法 使用 另一个类的对象 作为参数。在UML中,依赖关系用 带箭头的虚线 表示,由 依赖 的一方 指向 被依赖的一方,下面举两个依赖关系的例子:
驾驶员(Driver)开车,需要将车(Car)对象作为参数传递给 Driver 类 的 drive()方法
class Car {
public void move() {}
}; class Driver {
public void drive(Car car) { car.move();
}
};
依赖关系通常通过三种方式来实现:
将一个类的对象 作为 另一个类中方法的参数
在一个类的方法中将另一个类的 对象 作为 其对象的 局部变量
在一个类的方法中 调用 另一个类的 静态方法类之间的关系强弱顺序是这样的:继承(泛化) > 组合 > 聚合 > 关联 > 依赖。
三、组合、聚合、关联关系之间的区别
组合 和 聚合 的区别则在 语义 和 实现 上都有差别:
组合的两个对象之间生命周期有很大的关联,被组合的对象 在 组合对象创建的 同时或者创建之后 创建,在组合对象销毁之前销毁,聚合则无需考虑这些事情。
一般来说 被组合对象 不能脱离 组合对象独立存在,而且也只能属于 一个 组合对象,聚合则不一样,被聚合的对象可以属于 多个 聚合对象。
关联 和 聚合 的区别主要在于 语义 上:关联的两个对象之间一般是平等的,聚合则一般是不平等的。
(实际应用中,这三种关系的界限划分其实没有那么清楚,有些时候我们会感觉组合和聚合没什么区别,所以,在设计的时候没必要死抠细节,只要能够利用对象之间的关系设计出可行的解决方案即可。 如果同时有多个关系,只需画出最强的关系即可。)
最后,再举例子来描述一下这三种关系:
人和自己的心脏属于组合关系,因为心脏不能脱离人体而独自存在。
图书馆看书的时候,人和书属于聚合关系。书是可以独立存在的,而且书不仅可以属于自己,也可以属于别人。朋友之间属于关联关系,因为这种关系是平等的,关联关系只是用于表示两个对象之间的一种简单的联系而已。
原文链接:https://blog.csdn.net/weixin_43412762/article/details/134677819
相关文章:
一文搞懂 UML 类图
面向对象设计 主要就是使用UML的类图,类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据 一、UML类图简介 统一建模语言 UML …...
Zabbix 7 最新版本安装 Rocky Linux 8
前言 本实验主要在Rocky Linux 中安装Zabbix,其他centos8、Debian、Ubuntu、Alma Linux都可以安装,就是在中间件有点不同。Nginx就要配置一下,官网给的教程也算是很规范的,就是在MySQL上要自己安装,他没有告诉我们&am…...
使用HTML、CSS和JavaScript创建动态雪人和雪花效果
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 ✨特色专栏:…...
redis bind 127.0.0.1和bind 10.34.56.78的区别
绑定到 127.0.0.1,默认情况下,Redis 只会接受来自本地主机的连接。其他地址的则无法成功连接。如果绑定到主机的IP地址,则是可以被其他主机连接的。 可以通过iptables规则,进一步限制对redis的访问。 1、允许本地回环接口链接 …...
基于点云的 3D 目标检测模型 PointPillars 部署 tensorRT
PointPillars 3D 目标检测模型部署 tensorRT 一直想折腾一下基于点云的目标检测模型,但由于没有实际项目或工作需要,搞也搞的不够深入,把开源的模型跑一下似乎好像做过又好像没有做过。内心一直想搞一下,选定了 PointPillars 这个…...
centos查看硬盘资源使用情况命令大全
在 CentOS 系统中,你可以使用几个命令来查看硬盘的资源和使用情况。以下是一些常用的命令: 1. df 命令 df (disk free) 用于显示文件系统的磁盘空间占用情况。 df -h-h 参数表示以人类可读的格式(如 GB, MB)显示。输出会显示每…...
Solon MVC 的 @Mapping 用法说明
在 Solon Mvc 里,Mapping 注解一般是配合 Controller 和 Remoting,作请求路径映射用的。且,只支持加在 public 函数 或 类上。 1、注解属性 属性说明备注value路径与 path 互为别名path路径与 value 互为别名method请求方式限定(defall)可用…...
uni-app表单⑪
文章目录 十七、用户登录-登录界面搭建一、结构样式代码编写 十八、用户登录-表单验证一、userRulesMixin 文件使用二、验证规则编写 十七、用户登录-登录界面搭建 一、结构样式代码编写 uni-forms 插件下载 下载地址:https://ext.dcloud.net.cn/plugin?id2773 s…...
PyQt5 加载UI界面与资源文件
步骤一: 使用 Qt Designer 创建 XXX.ui文件 步骤二: 使用 Qt Designer 创建 资源文件 步骤三: Python文件中创建相关类, 使用 uic.loadUi(mainwidget.ui, self ) 加载UI文件 import sys from PyQt5 import QtCore, QtWidgets, uic from PyQt5.QtCore import Qt f…...
【MySQL】数据库知识突破:数据类型全解析与详解
前言:本节内容讲述MySQL的数据类型, 我们在学习之前的建表的时候已经用过各种各样的数据类型。 比如int、varchar、char类型等等。其中它们是对表的结构的操作, 并没有对数据的内容进行操作,所以它叫做DDL。另外,还有…...
使用Golang实现开发中常用的【实例设计模式】
使用Golang实现开发中常用的【实例设计模式】 设计模式是解决常见问题的模板,可以帮助我们提升思维能力,编写更高效、可维护性更强的代码。 单例模式: 描述:确保一个类只有一个实例,并提供一个全局访问点。 优点&…...
【Java学习】电脑基础操作和编程环境配置
CMD 在Windows中用命令行的方式操作计算机。 打开CMD Win R输入CMD按下回车键 Win E 进入我的电脑 常用的CMD命令 盘符名称冒号 说明:盘符切换 举例:E:回车,表示切换到E盘 dir 说明:查看当前路径下的内容 cd目录 说明&a…...
AVL树解析
目录 一. AVL的概念 二 AVL树的插入 2.1先按二叉搜索树的规则插入 2.2 AVL的重点:平衡因子更新 3.1 更新后parent的平衡因子等于0。 3.2 更新后parent的平衡因子等于1 或 -1,需要继续往上更新。 3.3 更新后parent的平衡因子等于2 或 -2,需…...
栈和队列(Java)
一.栈(Stack) 1.定义 栈是限定仅在表尾进行插入或删除操作的线性表 一般的表尾称为栈顶 表头称为栈底 栈具有“后进先出”的特点 2.对栈的模拟 栈主要具有以下功能: push(Object item):将元素item压入栈顶。 pop()&am…...
C#设计原则
文章目录 项目地址一、开放封闭原则1.1 不好的版本1.2 将BankProcess的实现改为接口1.3 修改BankStuff类和IBankClient类二、依赖倒置原则2.1 高层不应该依赖于低层模块2.1.1 不好的例子2.1.2 修改:将各个国家的歌曲抽象2.2 抽象不应该依于细节2.2.1 不同的人开不同的车(接口…...
easyfs 简易文件系统
easyfs easyfs 简易文件系统文件系统虚拟文件系统 VFS简易文件系统 easyfs磁盘布局超级块 easyfs 文件系统结构磁盘上的索引结构索引节点Inode 和 DiskInode 之间的关系举例说明读取文件的过程( /hello ) 参考文档 easyfs 简易文件系统 文件系统 常规文…...
【架构论文-1】面向服务架构(SOA)
【摘要】 本文以我参加公司的“生产线数字孪生”项目为例,论述了“面向服务架构设计及其应用”。该项目的目标是构建某车企的数字孪生平台,在虚拟场景中能够仿真还原真实产线的动作和节拍,实现虚实联动,从而提前规避问题ÿ…...
刚刚!更新宁德时代社招Verify测评语言理解数字推理SHL题库、网盘资料、高分答案
宁德时代社招入职的Verify测评主要分为两大块:语言理解和数字推理。语言理解部分包括阅读理解、逻辑填空和语句排序,要求在17分钟内完成30题。数字推理部分包括数字序列、数学问题解决和图表分析,同样要求在17分钟内完成18题。这些测评题目旨…...
C++笔记---智能指针
1. 什么是智能指针 1.1 RALL设计思想 RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种资源管理类的设计思想,广泛应用于C等支持对象导向编程的语言中。它的核心思想是将资源的管理与对象的生命周期紧密绑定…...
CentOS 7系统中更改YUM源为阿里云的镜像源
引言 更换阿里的镜像源可以带来诸多好处,包括提高下载速度、提升稳定性、同步更新、简化配置、节省带宽资源以及增强系统安全性等。因此,对于使用CentOS系统的用户来说,更换阿里的镜像源是一个值得考虑的选择。 1.备份yum源 mv /etc/yum.r…...
AI Agent Harness Engineering 生态工具链盘点:2026 开发者必备的 15 款核心工具
AI Agent Harness Engineering 生态工具链盘点:2026 开发者必备的 15 款核心工具 关键词:AI Agent Harness Engineering、Agent 编排调度、多模态工具调用、RAG增强协同、端云混合部署、伦理安全合规、图灵完备推理链、2026开发者技术栈 摘要:…...
从COCO person_keypoints到YOLO格式:一份完整的姿态估计数据集转换脚本与避坑指南
从COCO到YOLO格式:姿态估计数据集转换实战手册在计算机视觉领域,姿态估计任务正从学术研究快速走向工业应用。许多开发者希望利用YOLO系列模型(如YOLOv8-Pose)进行训练,却常常在数据预处理阶段遇到障碍。本文将提供一套…...
保姆级教程:在Deepin V23 Beta3上彻底禁用Nouveau并安装指定版本NVIDIA驱动(附卸载残留清理指南)
Deepin V23 Beta3系统NVIDIA驱动深度管理指南:从禁用Nouveau到版本精准控制在Linux系统上进行深度学习开发或高性能计算时,显卡驱动的稳定性和版本兼容性往往成为关键因素。Deepin V23 Beta3作为国内用户友好的发行版,其NVIDIA驱动管理有着独…...
漏洞研究工作流:从CVE追踪到Docker复现的闭环实践
1. 这不是资源列表,而是一套可落地的漏洞研究工作流“在线资源全攻略:漏洞复现、CVE 追踪、实战提升一条龙”——这个标题里藏着一个被很多人忽略的事实:漏洞研究从来不是靠堆砌工具和网站就能做好的事,它本质上是一套闭环的工作流…...
[开源] 临床路径卡牌化培训系统:面向医保办与临床科室的交互式规则教学工具
本项目是临床路径卡牌化培训系统(Pathway-Deck),专为医院医保办工作人员、临床科室教学负责人及新入职医师设计,将卫健委临床路径、DRG/DIP支付规则、医保负面清单等确定性规范,转化为可拖拽、可构筑、可验证的视觉化卡…...
Pikachu暴力破解实战:Burp Suite爆破思维训练全解析
1. 这不是“练手”,是真实世界暴力破解的完整沙盘推演很多人第一次点开Pikachu漏洞练习平台的“暴力破解”模块时,下意识觉得:“不就是写个脚本跑密码字典嘛?Python requests for循环,十分钟搞定。”我当年也是这么想…...
Linux端口敲门原理与knockd实战部署指南
1. 端口敲门不是玄学,是可控的“隐形门铃”很多人第一次听说“SSH端口敲门”,第一反应是:这玩意儿是不是给服务器加了一把看不见的锁?听起来很酷,但真用起来会不会像在黑盒里调音——敲对了门开,敲错了直接…...
J Thorac Oncol(IF=20.8)广东省人民医院钟文昭教授团队:基于影像组学的支持向量机区分驱动肺腺癌进展的分子事件
01文献信息本次分享的文献是由广东省人民医院肺癌研究所钟文昭教授团队联合华南理工大学医学院、广东省人民医院病理科、核医学科等多学科团队在2024年9月19日在《Journal of Thoracic Oncology》(中科院1区,IF20.8)上发表的研究“Radiomics-…...
DeepSeek总结的DuckDB动态函数应用插件
来源:https://github.com/teaguesterling/duckdb_func_apply DuckDB FuncApply 扩展 DuckDB 的动态函数应用 - 在运行时通过名称调用函数。 概述 FuncApply 扩展为 DuckDB 提供了动态函数调用能力,允许您: 使用 apply() 通过名称调用任何…...
卖轴承怎么找客户?下游工厂在哪里
卖轴承找客户,本质是找用轴承的下游工厂,核心难点是拿到这些下游厂的名单和联系人。轴承是机械传动的通用基础件,消耗量大、采购频繁,但下游行业分散、各自聚集在不同产业带,如果没有系统盘过下游版图,销售…...






