【设计模式】UML类图

news2025/5/22 12:22:15

设计模式学习之旅(一)
查看更多可关注后查看主页设计模式DayToDay专栏

一.UML概述

  • 统一建模语言(Unified Modeling Language,UML),是一种用于软件系统分析和设计的语言工具。特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。

  • UML本身是一套符号的规定,就像数学符号和化学符号一样,用于描述软件模型中的各个元素和他们之间的关系。

  • UML 从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等 9 种图。

二. 类图概述

  • 类图(Class diagram)显示了模型的静态结构,是UML图中最核心的。特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。
  • 在软件工程中,类图是一种静态的结构图,描述了系统的类的集合,类的属性和类之间的关系,可以简化了人们对系统的理解;

三.类图的表示方式

在UML类图中,类使用包含类名属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和address这3个属性,以及work()方法。
在这里插入图片描述

属性/方法名称前加的加号和减号表示了这个属性/方法的可见性,UML类图中表示可见性的符号有三种:

  • +:表示public

  • -:表示private

  • #:表示protected

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

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

注意:

1.中括号中的内容表示是可选

2.也可将类型放在变量名前面,返回值类型放在方法名前面

例如:
在这里插入图片描述

上图Demo类定义了三个方法:

  • method()方法:修饰符为public,没有参数,没有返回值。
  • method1()方法:修饰符为private,没有参数,返回值类型为String。
  • method2()方法:修饰符为protected,接收两个参数,第一个参数类型为int,第二个参数类型为String,返回值类型是int。

四. 类与类之间关系的表示方式

(1) 关联关系

关联关系是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,如老师和学生、师傅和徒弟、丈夫和妻子等。关联关系是类与类之间最常用的一种关系,分为一般关联关系、聚合关系和组合关系。我们先介绍一般关联。

关联又可以分为单向关联,双向关联,自关联。

(1.1).单向关联

在这里插入图片描述

在UML类图中单向关联用一个带箭头的实线表示。上图表示每个顾客都有一个地址,这通过让Customer类持有一个类型为Address的成员变量类实现。

(1.2).双向关联

在这里插入图片描述

从上图中我们很容易看出,所谓的双向关联就是双方各自持有对方类型的成员变量。

在UML类图中,双向关联用一个不带箭头的直线表示。上图中在Customer类中维护一个List<Product>,表示一个顾客可以购买多个商品;在Product类中维护一个Customer类型的成员变量表示这个产品被哪个顾客所购买。

(1.3).自关联

在这里插入图片描述

自关联在UML类图中用一个带有箭头且指向自身的线表示。上图的意思就是Node类包含类型为Node的成员变量,也就是“自己包含自己”。

(2) 聚合关系

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

聚合关系也是通过成员对象来实现的,其中成员对象是整体对象的一部分,但是成员对象可以脱离整体对象而独立存在。例如,学校与老师的关系,学校包含老师,但如果学校停办了,老师依然存在。

在 UML 类图中,聚合关系可以用带空心菱形的实线来表示,菱形指向整体。下图所示是大学和教师的关系图:
在这里插入图片描述

(3) 组合关系

组合表示类之间的整体与部分的关系,但它是一种更强烈的聚合关系。

在组合关系中,整体对象可以控制部分对象的生命周期,一旦整体对象不存在,部分对象也将不存在,部分对象不能脱离整体对象而存在。例如,头和嘴的关系,没有了头,嘴也就不存在了。

在 UML 类图中,组合关系用带实心菱形的实线来表示,菱形指向整体。下图所示是头和嘴的关系图:
在这里插入图片描述

(4) 依赖关系

依赖关系是一种使用关系,它是对象之间耦合度最弱的一种关联方式,是临时性的关联。在代码中,某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类(被依赖类)中的某些方法来完成一些职责。

在 UML 类图中,依赖关系使用带箭头的虚线来表示,箭头从使用类指向被依赖的类。下图所示是司机和汽车的关系图,司机驾驶汽车:
在这里插入图片描述

(5) 继承(泛化)关系

继承关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系,是一种继承关系,是依赖方法的特例

在 UML 类图中,泛化关系用带空心三角箭头的实线来表示,箭头从子类指向父类。在代码实现时,使用面向对象的继承机制来实现泛化关系。例如,Student 类和 Teacher 类都是 Person 类的子类,其类图如下图所示:
在这里插入图片描述

(6) 实现关系

实现关系是接口与实现类之间的关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。

在 UML 类图中,实现关系使用带空心三角箭头的虚线来表示,箭头从实现类指向接口。例如,汽车和船实现了交通工具,其类图如图 9 所示。
在这里插入图片描述

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

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

相关文章

Matlab论文插图绘制模板第72期—金字塔图

前段时间&#xff0c;有朋友觉得一篇文章里的插图看着不错&#xff0c;问Matlab能不能实现&#xff1a; 想了想&#xff0c;Matlab中并没有现成的画图代码。 但本质上&#xff0c;这种图其实就是横向柱状图的变体&#xff0c;而横向柱状图的绘制模板之前有分享过&#xff1a; …

Java多线程:线程的优先级 || 线程的中断 || 线程的分类 || 线程的定时器

Java多线程&#xff1a;线程的优先级 || 线程的中断 || 线程的分类 || 线程的定时器 每博一文案 正如村上春树所说&#xff1a;“当暴风雨过去&#xff0c;你不会记得自己是如何度过的&#xff0c;你甚至不确定&#xff0c;暴风雨是否真正结束了&#xff0c; 但你已不再是当初…

分布式唯一ID的几种生成方案,一次性全掌握!

上一篇文章&#xff0c;我们聊了一下分库分表相关的一些基础知识&#xff0c;具体可以参见&#xff1a;《用真实业务场景告诉你&#xff0c;高并发下如何设计数据库架构&#xff1f;》。 这篇文章&#xff0c;我们就接着分库分表的知识&#xff0c;来具体聊一下全局唯一id如何…

Flutter 基础-上

一、初始化项目 Material Design (Google 推出的前端UI 解决方案) 官网: https://www.material.io/中文网: https://material-io.cn/ Flutter 中一切内容都是组件(Widget) 无状态组件(StatelessWidget)有状态组件(StatefulWidget) 二、app结构 MaterialApp title (任务管理器…

【VScode技巧】:platformio部署ESP32Cam开发板

学习目标&#xff1a; 前几天用Arduino开发了ESP32Cam&#xff0c;实现了人脸识别的功能&#xff0c;今天无聊想了想ESP32Can也可以在VScode的Platformio中使用&#xff0c;于是就试着配置了一下。以下是配置环境的过程&#xff0c;谢谢大家观看。 正所谓工欲善其事&#xff0c…

【零基础】学python数据结构与算法笔记10

文章目录前言57.链表介绍58.链表的创建和遍历59.链表的插入和删除60.双链表61.链表总结62.哈希表62.哈希表实现64.哈希表应用总结前言 学习python数据结构与算法&#xff0c;学习常用的算法&#xff0c; b站学习链接 57.链表介绍 链表是由一系列节点组成的元素集合。每个节点…

React配置文件(五) 配置less

代码如下: module.exports { webpack: override( addLessLoader({ lessOptions: { javascriptEnabled: true, modifyVars: { primary-color: #1DA57A }, }, }), adjustStyleLoaders(({ use: [, , postcss] }) > { const postcssOptions postcss.options postcss.options …

SEO初学者如何快速做好 SEO 优化?seo数据查询

昨天给大家介绍了seo的意义和重要性&#xff0c;今天让我们一起看看10个基本的SEO初学者技巧&#xff0c;如何优化网站以增加流量。 1. 研究关键词并使用尾词 关键词在SEO中起着重要的作用。关键字表明了你文章的主要主题&#xff0c;它使人们有可能在网上搜索感兴趣的主题时找…

RK3588平台开发系列讲解(日志篇)RK3588 syslog的使用

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、查看是否启用syslog.conf二、配置启用syslog.conf1、配置busybox2、添加配置文件3、编译buildroot烧录三、验证1、编写测试代码2、查看日志文件3、运行测试程序沉淀、分享、成长,让自己和他人都能有所收获!😄 …

SpringCloudAlibaba入门(2023版)

先知 架构图一览 创建Serve端 新建项目 配置文件 application.yaml server:port: 8080# Eureka配置 eureka:instance:## Eureka实例的名称hostname: localhostAclient:# false表示自己端就是注册中心&#xff0c;职责就是维护服务实例&#xff0c;并不需要去检查服务fetch-r…

Kafka-eagle 安装教程

参考资料&#xff1a; 参考视频 Kafka-eagle官网 解释&#xff1a;Kafka-eagle 后来更名为 EFAK &#xff0c;所以打开官网会显示EFAK 环境准备&#xff1a; 要有本服务器可访问的MySQL服务&#xff0c;远程的请检查是否已经开启了MySQL远程访问&#xff0c;如果没有则需…

1.12 PWM实验

蜂鸣器--------TIM4 CH1/PB6 风扇-----------TIM1 CH1/PE9 马达-----------TIM16 CH1/PF6 一.PWM框图 RCC&#xff1a;使能GPIOB GPIOB&#xff1a;设置复用功能 TIM4:产生方波 二.分析RCC 确定总线&#xff0c;使能GPIOB和TIM4&#xff0c;GPIOE和TIM1,GPIO和TIM16 三.分…

【C++11】右值引用和移动语义

目录 一、左值 vs 右值 二、左值引用vs 右值引用 三、右值引用使用场景和意义 1. 左值引用的使用场景 2. 左值引用的短板 3. 右值引用和移动语义解决上述问题 四、右值引用引用左值的使用场景 五、完美转发 1. 模板中的&& 万能引用 2. std::forward 完美转发…

windows排查问题常用命令

查看JAVA进程占用PID: wmic process where caption"java.exe" get processid,caption,commandline /value查看进程端口信息&#xff1a;netstat -ano 或者 netstat -ano|findstr "8080" 或查看成功建立连接的&#xff1a;netstat -ano | findstr “ESTABLI…

C语言中的字符指针

目录1.字符指针指向一个字符2.字符指针指向一个字符串3.例题1.字符指针指向一个字符 int main() {char ch w;char *pc &ch;return 0; }将一个char类型的变量的地址放到一个char*类型的指针里去&#xff0c;这里的char*ps就是字符指针 在这里的字符指针与之前的整形指针等…

巧用gitbash的scp命令实现跨网段的文件直传

背景 嵌入式开发的工作流一般是这样的&#xff0c;程序员通过Windows电脑登陆Linux服务器&#xff0c;在服务器上编译出二进制文件后&#xff0c;先将文件scp到本地&#xff0c;然后再scp到Linux开发板&#xff0c;如下图所示 这样做需要执行两次scp命令&#xff0c;能否只执…

Golang cgo:如何在Go代码中调用C语言代码?

如何在Go代码中调用C语言代码&#xff1f; Go语言是通过自带的一个叫CGO的工具来支持C语言函数调用&#xff0c;同时我们可以用Go语言导出C动态库接口给其它语言使用。 方式一、直接在 Go 代码中写入 C 代码 检查是否开启cgo工具 首先&#xff0c;要查看是否已经开启cgo工具…

树状数组+例题

一、树状数组的定义 树状数组 或 二元索引树&#xff08;Binary Indexed Tree&#xff09;&#xff0c;现多用于高效计算数列的前缀和&#xff0c; 区间和。它可以以 log(n)log(n)log(n) 的时间得到任意前缀和&#xff0c;也支持在log(n)log(n)log(n)时间内支持动态单点值的修改…

Spring简介与使用

什么是spring spring是一个开源的框架&#xff0c;里面有一系列功能&#xff0c;可以使我们的开发变得更为轻松 简单来说&#xff0c;spring是包含众多工具方法的IoC容器 所谓容器&#xff0c;就是盛放东西的事务&#xff0c;例如我们的ArrayList就是数据存储的容器&#xff…

数据库——排序与分页

目录 排序数据 单列排序 多列排列 分页 分页原理 优点 MySQL 8.0新特性 排序数据 使用 ORDER BY 子句排序ASC&#xff08;ascend&#xff09;: 升序DESC&#xff08;descend&#xff09;:降序ORDER BY 子句在SELECT语句的结尾。 单列排序 SELECT employee_id,last_name…