UML——类图详解

news2024/12/28 18:56:46

目录

1. 前言

2. 类图概述

3. 类图表示法

3.1 类的表示方式

3.2 类与类之间关系的表示方式

(1)继承(泛化)关系

(2)实现关系

(3)依赖关系

(4)一般关联关系

(5)聚合关系

(6)组合关系


1. 前言

UML全称(Unified Modeling Language),译为统一建模语言,是用来设计软件的可视化建模语言。它的特点是简单,统一,图形化,能表达软件设计中的动态与静态信息。

UML从目标系统的不同角度出发,定义了用例图,类图,对象图,状态图,活动图,时序图,协作图,构件图,部署图九种图,本篇文章重点描述类图。


2. 类图概述

类图(Class Diagram)是显示了模型的静态结构,特别是模型中静态的类,类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。


3. 类图表示法

3.1 类的表示方式

在UML类图中,类使用包含类名,属性(field),方法(method),且带有分割线的矩形来表示。

如下图 Employee 员工类,它包含有name,age,address三个属性以及 work() 方法。属性/方法名称前面加的 "+" 和 "-" 表示了这个属性或方法的可见性。

一般情况下类的属性都是私有的,类的方法都是公开的;

"+" 表示 public 公开的,所有人都可以访问;

"-"  表示 private 私有的,只有本类中可以访问;

"#" 表示protected 受保护的,只有本包中的类或子类才可以访问;

什么都不加通常表示为默认,但一般很少使用;

属性的完整表示方式:可见性 名称:类型 [= 缺省值]

方法的完整表示方式:可见性 名称(参数列表) [: 返回值类型]

小练习:了解了表示方式,我们再来看下面这个类图,就非常好理解啦。

表示的含义就是类名为 Demo,没有属性值,有三个方法分别为 method,method1,method2;

method 方法访问修饰符为public,方法名为method,没有参数,方法没有返回值;

method1 方法访问修饰符为 private,方法名为 method1,没有参数,返回值类型为String;

method2 方法访问修饰符为 protected,方法名为 method2,有两个参数par1,par2,参数值类型分别为Int,String,方法返回值类型为Int。


3.2 类与类之间关系的表示方式

类与类之间的关联关系通常所熟知的是6种,如下图所示,但这6种之中,一般关联关系,聚合关系,组合关系都是属于关联关系这个大类中的,只是我们通常会将它们三者分开来说,这里展示此图也是为了小伙伴们能够清楚的知道类与类之间关联关系的分类。

下面我们就对这六种关系分别做出举例解释。

(1)继承(泛化)关系

继承关系使用实线空心三角表示,空心三角指向父类,一个父类可以被多个子类继承; 

继承关系(也叫泛化关系)大家都不陌生,在Java中子类extends继承父类,就拥有了父类中所有非私有化的属性和方法。

继承关系是对象之间耦合度最大的一种关系,在项目中,我们通常会将所有类公共的部分抽取出来作为一个Base基类,然后所有类去继承这个基类。

如下图,Person 人类为父类,Student学生类和Teacher教师类都继承Person人类;

(2)实现关系

实现关系使用虚线空心三角表示,空心三角指向被实现的接口,一个接口可以被多个类同时实现重写出不同的逻辑; 

实现关系就是接口和实现类之间的关系,Class 类 implements 实现接口 Interface,类就需要去重写接口中的所有抽象操作。

举个栗子:

如下 Vehicle 交通工具为接口,接口中定义了一个方法 move(),但并没有具体的实现,Car汽车类和Ship船类都可以实现 Vehicle 接口,并重写move()方法;

(3)依赖关系

依赖关系使用虚线箭头表示,箭头指向被依赖的类,一个类也可以被多个类依赖;

依赖关系是一种使用关系,它是对象之间耦合度最低的一种关联方式,是临时性的关联。一个类依赖另一个类,就使用带箭头的虚线表示,箭头指向被依赖类。

最直观的体现就是在代码中,某个类的方法通过局部变量,方法的参数或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法来完成一些职责。

举个例子:

如下图所示,有Driver司机类和Car汽车类,Driver类中有一个driver方法,参数需要传递Car类对象,Car类中有一个move方法。

司机类依赖汽车类,司机需要有汽车,才能进行移动;

(4)一般关联关系

一般关联关系有单向关联,双向关联,自关联三种情况

单向关联举例

Addres 是地址类,Customer 是顾客类,每一个顾客都会有一个地址,Customer 类中是可以定义Address对象作为自己的属性,这就属于单向关联。

UML图中单向关联使用实线实心三角箭头表示。

 双向关联举例

Customer顾客类,Product商品类。一个顾客可以拥有多个商品,一个商品也归属于一位顾客,像这样双方各自含有对方类型的成员变量,就属于双向关联。双向关联使用一条实线将双方连接起来就可以了

自关联举例

自关联在UML图中是使用一个箭头指向自己就可以了,自关联这种情况比较少见,但是却通常应用在树中。

一个树Tree可以有多个分支,一个分支上有很多叶子,这种情况通常会使用Node节点来展示,在Node节点中在定义自己Node,说白了就是Node里面嵌套Node,如果嵌套两层不够,可以继续嵌套Node,类似套娃。

(5)聚合关系

聚合关系是关联关系的一种,是强关联关系,是整体与部分之间的关系。

聚合关系是通过成员变量来实现的,其中成员对象是整体对象的一部分,但是成员对象却可以脱离整体而独立存在。

UML图中聚合关系使用实线空心菱形来表示,空心菱形指向整体类,实线另一端指向个体类,一个整体类可以由多个个体类聚合而成;

举个栗子:

学校的老师,学校的保安,学校里会存在老师,保安,学生,食堂阿姨等等一系列不同的人,这些人共同组成这个学校,如果有一天学校不在了,这些人仍然会存在,老师可以去另一家学校教书,保安也可以去另一家学校当保安。

放在代码中就是,一个类中的属性是由其他多个类对象构成的,如图,Teacher 教师类的类对象就可以作为 University 大学类中的一个属性存在,这就是聚合。

(6)组合关系

组合关系是一种比聚合关系更为强烈的关系,在组合关系中,整体对象可以控制部分对象的生命周期,一旦整体不存在,个体也将不复存在;

而上面我们说到的聚合关系中,个体可以脱离整体而独立存在,但是在组合关系中,个体不能脱离整体而存在,这就是它们二者最大的区别;

UML图中组合关系使用实线实心菱形表示,实心菱形指向整体类,实现另一端指向个体类,一个整体类可以由多个个体类组合而成;

举个栗子:

 Head 头类,头可以由眼睛,耳朵,鼻子,嘴巴等构成,但如果头不存在,那么组成头的眼睛,耳朵,嘴巴,鼻子也就不复存在了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1621988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android自定义ListView单击事件失效的解决方法

因为自带的listView不能满足项目需求,通过实现自己的Adapter去继承ArrayAdapter 来实现自定义ListView的Item项目。 出现点击ListView的每一项都不会执行setOnItemClickListener 里面的onItemClick 方法。 原因是item里面存在一些子控件,默认点击获取的…

使用 PhpMyAdmin 安装 LAMP 服务器

使用 PhpMyAdmin 安装 LAMP 服务器非常简单。按照下面所示的步骤,我们将拥有一个完全可运行的 LAMP 服务器(Linux、Apache、MySQL/MariaDB 和 PHP)。 什么是 LAMP 服务器? LAMP 代表 Linux、Apache、MySQL 和 PHP。它们共同提供…

如何在PostgreSQL中实现分布式事务,特别是在多节点集群环境中?

文章目录 解决方案:使用Citus实现分布式事务步骤一:安装和配置Citus步骤二:定义分布式表和分布键步骤三:执行分布式事务示例代码 总结 在PostgreSQL中实现分布式事务,特别是在多节点集群环境中,是一个复杂但…

c++ - 模板(一)

文章目录 一、函数模板 一、函数模板 1、概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本。 2、原理 函数模板是一个蓝图,它本身并不是函数,是编译器用…

【学习】如何高效地进行集成测试

在软件开发的过程中,测试环节至关重要。而在这其中,集成测试更是保证软件质量的关键步骤之一。本文将探讨如何高效地进行集成测试,以确保软件的稳定性和可靠性。 一、什么是集成测试 集成测试是指在单元测试的基础上,将模块按照设…

opencv可视化图片-----c++

可视化图片 #include <opencv2/opencv.hpp> #include <opencv2/core.hpp> #include <filesystem>// 将数据类型转换为字符串 std::string opencvTool::type2str(int type) {std::string r;uchar depth type & CV_MAT_DEPTH_MASK;uchar chans 1 (typ…

Redis入门到通关之Redis网络模型-用户空间和内核态空间

文章目录 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开发者。 博客特色&#xff1a; 在我的…

【行为型模式】解释器模式

一、解释器模式概述 解释器模式定义&#xff1a;给分析对象定义一个语言&#xff0c;并定义该语言的文法表示&#xff0c;再设计一个解析器来解释语言中的句子。也就是说&#xff0c;用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口&#xff0c;该接口…

STM32中的PWM

一、介绍 二、制作一个呼吸灯的效果&#xff08;使用PWM&#xff09; 原理是中心对齐的方式 学会分析复用管脚&#xff08;根据手册&#xff09; 配置 更正:是 最后一个输出的模式 最后生成代码 三、代码 要修改的业务代码 改代码&#xff0c;实现呼吸灯

科技赋能无人零售

科技赋能无人零售&#xff0c;使其具备以下独特优势&#xff1a; 1. 全天候无缝服务 &#xff1a;无人零售店依托科技&#xff0c;实现24小时不间断运营&#xff0c;不受人力限制&#xff0c;满足消费者随时购物需求&#xff0c;尤其惠及夜间工作者、夜猫子及急需购物者&…

聊聊.NET Core处理全局异常有那些方法

简述 处理全局异常的方法有IExceptionFilter&#xff08;异常处理&#xff09;&#xff0c;使用中间件异常处理&#xff0c;使用框架自带异常中间件等。考点 考察对异常处理方式的熟悉程度和广度&#xff0c;以及对中间件、过滤器熟练程度。 下面分别具体介绍三种处理异常的…

k-均值聚类

K均值聚类&#xff08;K-means clustering&#xff09;是一种常用的无监督学习方法&#xff0c;用于将一组数据点划分为K个簇&#xff08;cluster&#xff09;。 它的目标是将相似的数据点归到同一个簇中&#xff0c;同时使得不同簇之间的数据点尽可能不相似。K均值聚类算法的…

Golang | Leetcode Golang题解之第47题全排列II

题目&#xff1a; 题解&#xff1a; func permuteUnique(nums []int) (ans [][]int) {sort.Ints(nums)n : len(nums)perm : []int{}vis : make([]bool, n)var backtrack func(int)backtrack func(idx int) {if idx n {ans append(ans, append([]int(nil), perm...))return}…

有效三角形的个数 ---- 双指针

题目链接 题目: 分析: 这道题的意思就是将数组的元素, 拿出三个数, 能构成三角形就是有效的判断是否能构成三角形的条件: 两边之和大于第三边, 我们只需找到三个数中最小的两个数之和是否大于第三边, 大于则可以构成三角形解法一: 暴力解法, 即找到所有的三元组, 并挨个判断,…

「 网络安全常用术语解读 」SBOM主流格式SPDX详解

SPDX&#xff08;System Package Data Exchange&#xff09;格式是一种用于描述软件组件&#xff08;如源代码&#xff09;的规范&#xff0c;它提供了一种标准化的方法来描述软件组件的元数据&#xff0c;包括其许可证、依赖项和其他属性。SPDX最初由Linux基金会于2010年发起&…

vue 实现左侧导航栏,右侧锚点定位滚动到指定位置(超简单方法)

项目截图&#xff1a; 实现方法&#xff1a; 点击左侧菜单根据元素id定位到可视内容区域。 浏览器原生提供了一种方法scrollIntoView 。 通过scrollIntoView方法可以把元素滚动到可视区域内。 behavior: "smooth"是指定滚动方式为平滑效果。 具体代码如下&#xf…

linux安装MySQL8.0,密码修改权限配置等常规操作详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【一刷剑指Offer】面试题 8:旋转数组的最小数字

力扣对应题目链接&#xff1a;154. 寻找旋转排序数组中的最小值 II - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a; 旋转数组的最小数字_牛客题霸_牛客网 (nowcoder.com) 核心考点 &#xff1a;数组理解&#xff0c;二分查找&#xff0c;临界条件。 一…

Ajax和axios基础

AJAX Asynchronous JavaScript And XML 异步的JavaScript和XML 作用 数据交换: 通过Ajax可以给服务器发送请求,服务器将数据直接响应回给浏览器. 异步交互: 可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术. 同步和异步 同步发送请求: 浏览器发…

基于单片机的羽毛球计分器(含proteus仿真和程序)

目录 完整文本及仿真、程序可私信我获取 前言 第一章 设计任务及方案 1.1 设计任务 1.2 总体设计分析 1.3 功能模块方案设计 1.4 方案确定 第二章、硬件设计 2.1 AT89C51 单片机芯片介绍 2.1.1 主要特性 2.1.2 管脚说明 2.1.3 元件清单 2.2 电路介绍 2…