【UML建模】类图 类与接口表示方式、关系、基数详解

文章目录

  • 1.概述
  • 2.类的表示方式
    • 2.1.类与接口
    • 2.2.属性、方法、访问权限
  • 3.类之间的关系
    • 3.1.继承与实现
    • 3.2.关联、聚合、组合
      • 3.2.1.用代码表达关联关系
      • 3.2.2.用代码表达组合关系
      • 3.2.3.用代码表达聚合关系
    • 3.3.依赖
      • 3.3.1.依赖关系的代码实现
  • 4.基数
  • 5.总结

1.概述

在我们的日常学习、工作、考试以及面试的过程中,都会使用到类图,它是一种表示系统中的类、接口、属性和方法等静态结构的图形语言,常用于面向对象的软件设计、分析,对技术实现起到指导作用,是架构师的常用工具之一。

通过类图,可以更好地理解系统的结构和设计,提高开发效率和软件质量。对于学习过设计模式的同学来说,肯定会有更深刻的感触,正是因为有类图我们更直观的理解各种模式的实现方式,并按照类图的指导去完成我们自己的设计模式代码。

综上,能够看懂并画出类图就显得尤为重要了,本篇主要是讲述类型中的核心概念以及使用方式,主要包括:

  • 类、属性、方法、访问权限的表示方式
  • 类与类之间的关系及其符号表示方式
  • 基数的使用

在类图中,每个类都被表示为一个矩形框,其中包含类的名称、属性和方法,类之间的关系可以通过不同的关系符号来表示,下面我们直接切入主题。

2.类的表示方式

表现形式即我们可以通过什么样的图形来表现出类所包含的信息,例如类与接口如何表示,如何表示属性与方法,如何表示访问权限

2.1.类与接口

类和接口在类型中都是用矩形的方框来表示,方框分为两层,在第一层中会写接口名类名,接口的第一层方框中还会用<<interface>>来表示,如下图所示:
在这里插入图片描述

2.2.属性、方法、访问权限

在方框的第二行,则会写属性与方法,在属性和方法的左边还会用一些符号来表示访问权限,如下图:
在这里插入图片描述

  • +:表示 public
  • -:表示 private
  • #:表示 protected
  • 无符号:表示 default

从上图我们发现属性和方法是放在同一层的,现在的写法还比较直观,但是当属性和方法变多,且不按照顺序来写的时候就会显得有点杂乱,不能直观的看出类的结构。

所以,还有另一种画类图的方式,将类图的方框隔离为三层,第二层定义属性,第三层定义方法。按照新的格式得到新的类图如下:
在这里插入图片描述
如果是初期的领域划分建模,可以使用两层方框的表示方式,甚至只需要单层的方框填入类名即可,不需要填入大量的属性和方法,这种方式在初期建模时会更加简洁明了。如果是在做较详细的技术实现,建议使用具有3层方框的表示方式,这种方式整理的信息更加丰富和清晰

3.类之间的关系

类之间的关系一共有6种,耦合程度由强到弱可以表示为:

实现 = 泛化 > 组合 > 聚合 > 关联 > 依赖

  • 实现(Realization):表示类和接口之间的实现关系。
  • 泛化(Generalization):表示类之间的继承关系,也被叫做继承。
  • 组合(Composition):表示一个类对象包含另一个类对象,强整体与部分的关系。
  • 聚合(Aggregation):表示一个类对象包含另一个类对象,弱整体与部分的关系。
  • 关联(Association):表示一个类对象包含另一个类对象,是一种静态的关系。
  • 依赖(Dependency):表示一个类在其方法中使用到了另一个类,但两者之间不具有持久性的包含关系。

只是看这样的解释,可能还是不太了解各个关系之间的区别到底是什么,尤其是组合、聚合、关联看起来都差不多。但是没有关系,在下面的内容中会有“说人话”的方式来详细解释各个关系。

3.1.继承与实现

继承与实现在类图中表现为is-a的关系,通过空心三角形来表示,其中实现用虚线表示、继承用实现表示。

空心三角形画在父类或父接口这一端,下图分别表示了类B实现接口A类B继承类A的关系:
在这里插入图片描述
继承与实现大家都是比较熟悉的,这里就不过多的赘述。

3.2.关联、聚合、组合

关联关系是类图中最不容易区分清楚的部分,聚合与组合是关联关系的一种特殊的表现形式,它们三种都是has-a的关系。

关联关系表示为实线,聚合和组合是在关联的基础上加入了菱形来表示,聚合表示为空心菱形,组合表示为实心菱形。

如果将一个类作为包含类,那么它的成员变量中的类就是成员类,菱形是画在包含类这一端,如下图:

在这里插入图片描述
上图中的表达的关系,从上到下分别为:

  • 类A与类B存在关联关系(这个关联关系并不明确,有可能是双向关联)
  • 类A是类B的一部分
  • 类A中包含了类B

上面的表示方式是部分教程了较为标准的一种画法,但有时候也会看到另一种画法,在实现上会带上箭头,如下图所示:
在这里插入图片描述
在这张图中关联关系带上了箭头,表示的是单项的关联关系,即类A中关联了类B,而组合与聚合表达的含义与上面不带箭头的图一致。

之所以要学习这种画法,主要是在看资料的时候遇到两种不同的画法都能看得懂。

3.2.1.用代码表达关联关系

所谓的关联关系,就是一个类中使用了另一个类作为成员变量,至于这个成员变量是如何被使用的,并不是关联关系需要关注的。

例如现在存在两个类学生Student和课程Course的双向关联关系,如图:
在这里插入图片描述

class Student {
  Course course;
}

class Course {
  Student student;
}

同理,如果是单向关联,则可以表示为:
在这里插入图片描述

class Student {
  Course course;
}

class Course {

}

3.2.2.用代码表达组合关系

组合是一种强has-a关系,它要求的是一个类中有另一个类作为其成员变量的前提下,成员类依赖于包含类的生命周期,简单的说,就是两个类的生命周期一致,一荣俱荣,一损俱损。

例如现在有一个Person类,它引入了一个Heart作为成员变量:
在这里插入图片描述
Heart会在Person的构造函数中被new出来,随Person的创建而创建,同时当Person被销毁后回收后,Heart没有了引用也会被回收掉。

class Person {

  private Heart heart;

  public Person() {
    this.heart = new Heart();
  }

}

class Heart {

}

3.2.3.用代码表达聚合关系

组合是一种弱has-a关系,与组合关系不同的是,成员类不会依赖包含类的生命周期,简单的说,即使是某个类被销毁了,它的成员类也不会被销毁。

例如现在有一台电脑Computer,接入了一个键盘Keyboard,即使电脑坏了,我这个键盘还可以接入到其他的电脑上使用:
在这里插入图片描述

我们可以通过构造方法或者setter方法将键盘注入到电脑中:

class Computer {

  private Keyboard keyboard;

  // 通过构造方法的参数注入
  public Computer(Keyboard  keyboard) {
    this.keyboard= keyboard;
  }
  
  // 通过setter方法注入
  public void setKeyboard() {
    this.keyboard= keyboard;
  }
}

class Keyboard {

}

相信用过Spring的同学,一定对上面的这段代码非常熟悉,这就是我们常说的构造方法注入set注入,不难看出,Spring中的依赖实现方式大多是通过聚合的方式来实现的。

3.3.依赖

依赖在类图中也是has-a的关系,表达的是一个类在它运行自己函数的过程中使用到了另一个类,函数没有运行的时候就不会使用到这个类。

依赖关系也可以算作是一种特殊的关联关系,我们从类图中就可以看出来,依赖关系的类图是由虚线+箭头组成(关联是实线+箭头)。下图表示的是类A中使用到了类B
在这里插入图片描述

3.3.1.依赖关系的代码实现

依赖关系在代码中往往表示为方法的形参以及局部变量,以一个简化版的工厂模式为例,提供一个汽车工厂CarFactory,在这个工厂中可以生产汽车Car
在这里插入图片描述

class CarFactory {

  public Car crateCar() {
    return new Car();
  }
}

class Car{

}

4.基数

基数(multiplicity) 在有些教材上也叫多重度(multiplicity)也叫,用来表示关联的类之间的数量关系,也就是我们常说的一对一 , 一对多 , 多对多,上述的4种关系关联、组合、聚合、依赖中都可以添加基数。

基数由数字 , * , .. 组成,数字表示的是类的具体数量,* 表示的是0个或多个的意思,而..是两个符号之间的连接符,用于表示一个区间关系,例如:

  • 1:表示1个
  • 0..1:表示0个或1个
  • 0..*:表示0个或多个,也可以直接用*表示
  • 1..*:表示1个或多个

基数的符号是写在关系的连线两端的,以上面的学生选择课程为例,一个学生至少选择1门课程,学有余力的可以选择多门,则可以通过下面的图形来表示:
在这里插入图片描述
写成代码,就是成员变量Course由一个对象,修改为一个集合:

class Student {
  List<Course> courses;
}

class Course {

}

5.总结

本篇主要是在讲述如何通过图形语言来描述类和接口,类之间的关系以及基数,通过本篇文章中的知识点,我们已经基本可以看懂并设计自己的类图了。当然,类图的画法是多种多样的,本篇文章中并没有例举完整,例如在菜鸟教程中搜索设计模式,你可能会看到这样的类图:
在这里插入图片描述

在这张图中,关系的表达方式与上述的表达方式不太相同,是使用统一箭头加描述的方式来表达的,但相信大家有了本篇文章的基础之后,看到这样的类图也不会有什么压力,所以我们在日后的工作学习中继续查漏补缺即可。


最后,再总结一下本篇中的几个重点知识点:

  • 类的表示方式:掌握类的画法
    通过一个划分为3层的方框来表示,第一层是名字、第二层是属性、第三层方法,如果是接口,可以在第一层的第一行写上<<interface>>
  • 关系:代表各种关系的图标,以及关联、组合、聚合、依赖的区别
    • 图标:
      • 继承与实现是空心三角形,继承是实线,实线是虚线
      • 关联与依赖是箭头,关联是实线、依赖是虚线
      • 组合与聚合是菱形,组合是实心菱形,聚合是空心菱形
    • 关联和依赖的区别:关联是成员变量,依赖是局部变量
    • 组合与聚合的区别:组合中的成员类与包含类有相同的生命周期,而聚合中成员类有自己独有的生命周期
  • 基数:基数的含义与表示方式
    • 含义:用于表达关联的类之间的数量关系
    • 表示方式:写在关联连线的两端,有一对一 , 一对多 , 多对多三种,需要注意0..**表示的是同一个意思,即:0个或多个

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

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

相关文章

斐波拉契数列,有人买了一对小兔子,已知小兔子一个月后长成大兔子,大兔子每个月生一对小兔子,问:两年(24个月)之后,他一共有几对兔子。

[01]斐波拉契数列&#xff0c;有人买了一对小兔子&#xff0c;已知小兔子一个月后长成大兔子&#xff0c;大兔子每个月生一对小兔子&#xff0c;问:两年(24个月)之后&#xff0c;他一共有几对兔子。 第i月份大兔子小兔子总兔子1011210131124213532565387851381382192113341034…

Qt 正则表达式匹配失败的一个原因

在Qt中做正则表达式时&#xff0c;遇到一个很坑爹的问题&#xff0c;还是经验不足导致。 在正则表达式中&#xff0c;有很多需要元字符&#xff0c;是需要使用普通字符加转义符号搭配使用的。比如\w&#xff0c;\s。对于这类字符&#xff0c;在Qt中使用时&#xff0c;对\再次进…

Prometheus监控实战系列二十:监控Kubernetes集群(下)

本文承接上篇&#xff0c;在本篇中我们会讲解Prometheus如何应用基于Kubernetes的服务发现功能&#xff0c;检索目标信息并进行监控。 在监控策略上&#xff0c;我们将混合使用白盒监控与黑盒监控两种模式&#xff0c;建立起包括基础设施(Node)、应用容器&#xff08;Docker)、…

【新】(2023Q2模拟题JAVA)华为OD机试 - 时间格式化

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:时间格式化 题目 运维工程师…

(一)人工智能应用--深度学习原理与实战--初识深度学习

认识人工智能、机器学习与深度学习的关系 人工智能(Artificial IntelLigence)诞生于20世纪50年代,其简洁定义为:让计算机自动完成通常由人类完成的智力任务。人工智能是一个综合性领域。最早期出现的预定义规则的专家系统(Expert System) -----由程序员精心设计出明确的规则…

Flink从入门到精通之-05 DataStream API

Flink从入门到精通之-05 DataStream API 我们在第 2 章介绍 Flink 快速上手时&#xff0c;曾编写过一个简单的词频统计&#xff08;WordCount&#xff09;程序&#xff0c;相信读者已经对 Flink 的编程方式有了基本的认识。接下来&#xff0c;我们就将开始大量的代码练习&…

基于springboot实现学生成绩管理系统【源码+论文】

16springboot学生成绩管理系统演示录像2022_o8mkp开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mav…

AirServer手机投屏软件的功能优势特点介绍

AirServer是适用于Mac和PC的先进的屏幕投屏软件&#xff0c;功能是十分强大。它的主要功能在于实时地将移动设备上的图像画面内容投放到电脑设备上&#xff0c;让电脑成为iPad、iPhone等iOS系统设备的大屏显示器。在设备之间建立局域网内的信号发送与接收通道&#xff0c;确保数…

细谈linux软硬链接

文章目录Ⅰ. 软链接Ⅱ. 硬链接1、硬链接2、硬链接数Ⅲ. 软硬链接的区别Ⅳ. 软硬链接的应用1、软链接的应用2、硬链接的应用3、硬链接创建规定Ⅰ. 软链接 ​ 在讲这些链接之前&#xff0c;我们都会先讲如何创建它们&#xff01; ​ 对于软连接&#xff0c;在 linux 中&#xf…

python matplotlib 图片显示中文

在Linux 环境中&#xff0c;使用matplotlib 显示中文时&#xff0c;总是提示&#xff1a; /python/stock.py:273: UserWarning: Glyph 33647 (\N{CJK UNIFIED IDEOGRAPH-836F}) missing from current font. fig.savefig(self.name ".jpg", bbox_inches tight) …

【数据结构】插入排序 (直接插入排序 希尔排序)

文章目录直接插入排序希尔排序直接插入排序 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列。 如果tmp比end的数大或者相等&#xff0c;就继续放在end后面。 如果比end的数小&…

Elasticsearch基本安全加上安全的 HTTPS 流量

基本安全加上安全的 HTTPS 流量 在生产环境中&#xff0c;除非您在 HTTP 层启用 TLS&#xff0c;否则某些 Elasticsearch 功能&#xff08;例如令牌和 API 密钥&#xff09;将被禁用。这个额外的安全层确保进出集群的所有通信都是安全的。 当您在模式下运行该elasticsearch-ce…

初始React

一.React的诞生1.什么是React?React是一个讲数据渲染为HTML视图的来源Js库&#xff0c;用于构建用户界面的JS库。在以前的学习中构建用户界面的常用操作步骤&#xff1a;发送请求获取数据处理数据&#xff08;过滤&#xff0c;整理格式等&#xff09;操作DOM呈现页面2.React诞…

《SpringBoot》第02章 自动配置机制(一) 项目启动

前言 关于SpringBoot&#xff0c;最大的特点就是开箱即用&#xff0c;通过自动配置机制&#xff0c;遵守约定大于配置这个准则&#xff0c;那么这个是如何实现的呢&#xff1f; 本章首先会介绍SpringBoot的启动执行 一、启动第一步&#xff1a;初始化 1.本章概述 当启动Sp…

【论文精读(李沐老师)】Attention Is All You Need

Abstract 在主流的序列转录&#xff08;给你一个序列&#xff0c;生成另外一个序列&#xff09;模型中主要是依赖复杂的RNN和CNN&#xff0c;一般包括encoder和decoder两个结构。在性能最好的模型里&#xff0c;通常使用注意力机制连接encoder和decoder。 &#xff08;本文想做…

HTTP API接口设计规范

1. 所有请求使用POST方法 使用post&#xff0c;相对于get的query string&#xff0c;可以支持复杂类型的请求参数。例如日常项目中碰到get请求参数为数组类型的情况。 便于对请求和响应统一做签名、加密、日志等处理 2. URL规则 URL中只能含有英文&#xff0c;使用英文单词或…

爱玩飞飞加速实现与分析

一步一步找数据。然后根据游戏数据找游戏基址&#xff0c;游戏基址可以遍历所有数据。想学的可以看看。第一步找基础数据&#xff0c;我们用的ce7.1.当然你们也可以用其他版本。网上随便下一个就行。 第一步。打开ce7.1附加游戏进程。 然后看下自己的血量是多少。我们这里是5…

HTML5支持的视频文件格式和音频文件格式有哪些?

在 HTML5 标准中, 我们有了新的 和 标签, 分别可以引入视频和音频文件的标签 那么这些标签又可以支持哪些文件格式呢 ? 格式支持 视频文件格式 MP4&#xff1a;MPEG-4 Part 14&#xff0c;支持H.264编码。几乎所有的浏览器都支持该格式。 WebM&#xff1a;谷歌开发的格式&a…

【最短路算法】第三弹:一文学懂spfa 算法(队列优化的Bellman-Ford算法)

博主简介&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;算法、数据结构、Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: 算法 &#xff1b;该专栏专注于蓝桥杯和ACM等算法竞赛&#x1f525;近期目标&…

Java Script

一.初识js 1.与css html的关系 HTML 网页的结构(骨CSS:网页的表现(皮JavaScript :网页的行为2.运行过程 编写的代码是保存在文件上,也就是存储到硬盘(外存zhong)双击以后,html文件浏览器(引用程序)就会读取文件,将文件内容加载到内存中,(数据流向:硬盘->内存)浏览器会解析用…