UML——类图详解

目录

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 头类,头可以由眼睛,耳朵,鼻子,嘴巴等构成,但如果头不存在,那么组成头的眼睛,耳朵,嘴巴,鼻子也就不复存在了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FRPC+PHP+MYSQL+APACHE2=个人网站

应用背景有公网需求,但是又不想去买又贵又低配置的服务器,然后方案就应运而生 frp/README_zh.md at dev fatedier/frp (github.com) 在这里, FRPC作为内网穿透服务, PHPMYSQLAPACHE2,作为网站搭建,具体细节不细讲, 但是在我的/var/www/html下面 linaroHinlink:/var/www/h…

代码随想录算法训练营Day8 | ● 344.反转字符串● 541. 反转字符串II● 54.替换数字● 151.翻转字符串里的单词● 55.右旋转字符串

(记得重学) ● 344.反转字符串 题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一…

【蓝桥杯2025备赛】集合求和

集合求和 题目描述 给定一个集合 s s s(集合元素数量 ≤ 30 \le 30 ≤30),求出此集合所有子集元素之和。 输入格式 集合中的元素(元素 ≤ 1000 \le 1000 ≤1000) 输出格式 s s s 所有子集元素之和。 样例 #1 …

JAVAEE—HTTP

文章目录 HTTP导读HTTP解析HTTP的格式分析环境准备 HTTP请求格式首行headerHostContent-LengthContent-TypeUser-Agent (简称 UA)RefererCookie 空行body HTTP响应格式认识HTTP的方法POST方法POST和GET的区别第一:用处第二:传递数据第三:GET不…

【漏洞复现】通天星CMSV6车载监控平台Logger未授权漏洞

漏洞描述: 通天星CMSV6车载定位监控平台拥有以位置服务、无线3G/4G视频传输、云存储服务为核心的研发团队,专注于为定位、无线视频终端产品提供平台服务,通天星CMSV6产品覆盖车载录像机、单兵录像机、网络监控摄像机、行驶记录仪等产品的视频…

Sylar C++高性能服务器学习记录05 【线程模块-知识储备篇】

早在19年5月就在某站上看到sylar的视频了,一直认为这是一个非常不错的视频,还有幸加了sylar本人的wx,由于本人一直是自学编程,基础不扎实,也没有任何人的督促,没能坚持下去,每每想起倍感惋惜。恰…

Android IPC | Android多进程模式

前 言 关于Android的进程间通信(即IPC)有很多种方式,比如我们常用的AIDL、Socket等,而其中最重要而且最需要掌握的就是AIDL的使用和原理,简单来说它是通过Binder实现的。 关于Binder的知识点非常多,当我们…

libtorrent - 安装小记

文章目录 官方文档:libtorrent python binding http://libtorrent.org/python_binding.html 1、下载代码 建议使用: git clone --recurse-submodules https://github.com/arvidn/libtorrent.git如果在 github web 界面下载代码,build 的时候…

sentinel-1.8.7与nacos-2.3.0实现动态规则配置、双向同步

😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: sentinel-1.8.7与nacos-2.3.0实现动态规则配置、双向同步 ⏱️ 创作时…

FL Studio21.2中文破解版下载2024最新五月破解步骤教程

FL Studio 21.2.3.4004中文版 中文别名水果编曲软件,是一款全能的音乐制作软件,包括编曲、录音、剪辑和混音等诸多功能,让你的电脑编程一个全能的录音室,它为您提供了一个集成的开发环境,使用起来非常简单有效&#xf…

MATLAB命令

MATLAB是一个用于数值计算和数据可视化的交互式程序。您可以通过在命令窗口的MATLAB提示符 ‘>>’ 处键入命令来输入命令。 在本节中,我们将提供常用的通用MATLAB命令列表。 用于管理会话的命令 MATLAB提供了用于管理会话的各种命令。下表提供了所有此类命令…

基于springboot+vue+Mysql的CSGO赛事管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

京东商品差评获取

1.背景 场景一:一个市场研究员或者是一个企业的产品经理,需要下载差评来了解消费者对于某一产品或者服务的不满,以便改进他们的产品或服务。 场景二:一个人是某个企业的竞争对手,需要下载差评来了解他们的竞争对手的…

java自动生成pojo,springboot自动生成pojo

第一步 pom引入依赖 <dependencies><!-- mybatis-generator --><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.7</version></dependency>&…

乒乓球廉价底板及套胶评测5

今天给同事贴一个银河t2底板&#xff0c;正手狂39度&#xff0c;反手拍里奥&#xff0c;银河t2是碳板&#xff0c;考虑到使用的长期性&#xff0c;没有灌油&#xff0c;用的无机胶水。 这套装备本身没有什么瑕疵&#xff0c;主要还是考虑正手狂三的通透性&#xff0c;我认为有…

QML 中的状态

Qt hello – 专注于Qt的技术分享平台 状态描述了当前用户界面样子&#xff0c;QML中一个状态定义了一组属性的改变&#xff0c;并且会在一定条件下被触发。 假设有这么一个场景&#xff0c;红黄绿三个灯&#xff0c;用一个按钮&#xff0c;点击后依次切换三个灯亮起。使用QWi…

【C++干货基地】深度理解C++中的高效内存管理方式 new delete

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

星松云新品边缘计算路由器,上网收益两不误

随着互联网的普及和发展&#xff0c;人们对于网络带宽和稳定性的需求日益增加&#xff0c;而同时&#xff0c;对于网络使用的成本也变得越来越重要。在这样的背景下&#xff0c;星松云推出了全新的边缘计算路由器&#xff0c;为用户带来了一个既能享受高速网络&#xff0c;又能…

设计模式(六):原型模式

设计模式&#xff08;六&#xff09;&#xff1a;原型模式 1. 原型模式的介绍2. 原型模式的类图3. 原型模式的实现3.1 创建一个原型接口3.2 创建具体原型3.3 创建一个数据缓存类3.4 测试 1. 原型模式的介绍 原型模式&#xff08;Prototype Pattern&#xff09;属于创建型模式&…

2024 年 Rust 开发者路线图

Rust 近年来因其对性能、安全性和并发性的关注而广受欢迎。作为一名开发人员&#xff0c;掌握 Rust 可以为各种机会打开大门&#xff0c;包括 Web 开发。 在 github 上发现了这个优秀的路线图&#xff0c;由 Anshul Goyal 创建&#xff0c;它提供了一条全面的路径&#xff0c;概…