UML静态图-类图

概述

静态图包含类图、对象图和包图的主要目的是在系统详细设计阶段,帮助系统设计人员以一种可视化的方式来理解系统的内部结构和代码结构,包括类的细节、类的属性和操作、类的依赖关系和调用关系、类的包和包的依赖关系。

一、类图的表示法

类图(Class Diagram)是描述类、接口、协作及它们之间关系的图,用来显示系统中各个类的静态结构。类图是定义其他图的基础,在类图基础上,可以使用序列图、协作图、组件图和部署图等进一步描述系统其他方面的特性。
类图包括6个元素:类(Class)、接口(Interface)、泛化关系(Generalization)、关联关系(Association)、依赖关系(Dependency)及实现关系(Realization)。

1.类图的表示法
类的名称是每个类中所必有的构成元素,用来区分其他的类。类名是一个字符串,称为简单名字。路径名字是在类名前加包含类的包名为前缀。例如 User、java::uti::List 都是合法的类名。
类的 UML表示为一个长方形垂直地分为3个区。顶部区域显示类的名字,中间区域列出类的属性变量,底部区域列出类的操作函数。当在一个类图上画一个类元素时,必须要有顶端的区域,下面的两个区域是可选择的(当图描述仅仅用于显示分类期间关系的高层细节时,下面的两个区域是不必要的)。
在这里插入图片描述
对应代码为:

public class User{
}

2.类图属性的表示法

类的属性(中部区域)在分隔线上列出每一个类的属性,类可以有任意多个属性,也可以没有属性。按照 UML的约定,单字的属性名需要小写。如果属性名包含多个单词,这些单词要合并,且除了第一个单词外其余单词的首字母要大写。在类图中属性只要写上名字就可以了,如图3-2所示。

对于属性,还需要了解以下3个方面。
1)属性类型
也可以在属性名后通过冒号来执行属性的类型,如图3-3所示
在这里插入图片描述
对应的类代码为:

public class User {
	private String username;
	private String password:
}

2)属性默认值
也可以在属性名后跟上类型甚至默认值,如图3-4所示:
在这里插入图片描述
对应的类代码为:

public class User {
	private String username = "admin';
	private String password = "123";
}

3)属性的可见性
类中属性的可见性主要包括:

  • 公有,使用关键字 public。
  • 受保护,使用关键字 protected.
  • 私有,使用关键字 private。
  • 默认,不使用关键字。

4种可见性如图 3-5 所示。

在这里插入图片描述
3.类图操作的表示法
类的任意一个实例对象都可以调用操作,并可能影响该对象行为的实现。类操作记录在类图长方形的第3个(最低的)区域中,它也是可选择的。与属性一样,类的操作以列表格式显示,如3-6 所示。
在这里插入图片描述
操作的命名与属性类似,第一个单词的首字母小写,后续每一个单词的首字母要大写。操作也拥有不同的可见性,默认的可见性为public的,与属性相似,它也可以设置如下4种可见性:

  • 公有,使用关键字public。
  • 受保护,使用关键字 protected。
  • 私有,使用关键字 private。
  • 默认,不使用关键字。

4种可见性显示的图标分别为如图3-7所示的 getUsername()、setUsername()、getPassword()和setPassword()前的图标。
在这里插入图片描述

二、接口的表示法

接口与类相似,它仅仅包含操作但不包含属性,且它没有对外界可见的关联。它直接对应于 Java中的一个接口类型。接口可用如图3-8所示的两种图来表示,两条竖线的上方为接口名,下方为接口的操作列表。
在这里插入图片描述
以上对应的 Java 类代码如下:

public interface MyInterface {
	public void insertUser();
}

接口除了没有属性外,其他的定义都与类相同,这里就不再重复介绍。

三、类图之间的 4 种关系

类之间存在4种关系:

  • 泛化关系(Generalization)表示类的继承。
  • 关联关系(Association)表示类的变量,还包括聚合和组合
  • 依赖关系(Dependency)表示局部变量。
  • 实现关系(Realization)–表示接口的实现。

1. 泛化关系(Generalization)–表示类的继承
泛化关系表示类与类之间的继承关系,接口与接口之间的继承关系。泛化关系是从子类指向父类的,或从实现接口的类指向被实现的接口,与继承的方向相反,如图3-10所示。
在这里插入图片描述
泛化关系在 Java 语言中可以直接使用关键字 extends 表示,描述类与类、接口与接口之间的泛化。以上的泛化可以表示为如下的代码:

public class ClassA extends ParemtClass {}
public class ClassB extends ParemtClass {}

2.关联关系(Association)-表示类的变量
关联关系是类与类之间的连接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。

  • 双向的关联可以有两个箭头或者没有箭头,通常不鼓励使用双向的关联。
  • 单向的关联有一个箭头,表示关联的方向,单向的关联使用更为普遍。

每一个关联都有一个名字,如图3-11所示。
在这里插入图片描述
在Java 代码中,关联关系是表示变量的引用。例如上面的例子中,类 User 拥有一个 Book 类型的变量 book,这个变量实现了这两个类之间的关联关系。以上的关联可以用下面的代码表示:

public class User {
	...
	private Book book;
	...
}

在关联的两端可以使用一个数字表明该端可以有几个实例,数字可以有以下4种用法:

  • 0…1–表示零个或一个实例。
  • 0…或者–表示对实例的数目没有限制。
  • 1–表示只有一个实例。
  • ] *_-表示至少有一个实例。

如图 3-12所示,它表示每一个User 实例可以拥有任意数量的 Book 实例。
在这里插入图片描述
一个关联关系往往可以进一步确定为聚合关系或者合成关系。

1)聚合关系(Aggregation)
聚合关系表示整体和部分关系的关联,聚合关系描述了“hasa”的关系。聚合暗示着整体在概念上处于比局部更高的一个级别,而关联暗示两个类在概念上位于相同的级别。聚合也转换成 Java中的一个实例作用域变量。聚合是一种单向关系,聚合与关联的区别在于聚合的两个类之间的关系在概念层次上不是一个级别的,一般来说聚合中的类关系总是一个类比另一个类要高级一些,而关联基本上是平级的。例如电脑是 CPU、主板、机箱的聚合。

2)组合关系(Compostion)
组合关系是聚合关系中的一种特殊情况,是更强形式的聚合,又被称为强聚合。在组合中,成员对象的生命周期取决于聚合的生命周期。组合也是非共享的,所以,虽然局部不一定要随整体的销毁而被销毁,但整体要么负责保持局部的存活状态,要么负责将其销毁。局部不可与其他整体共享。但是,整体可将所有权转交给另一个对象,后者随即将承担生存期职责。例如,人是大脑、四肢、躯干的组合。

3.依赖关系(Dependency)-表示局部变量
依赖关系也是类与类之间的连接,它是单向的关系。依赖关系表示一个类依赖于另一个类。例如 User 需要办理图书证 BookCard,则它就依赖于类 BookCard,其表示关系如图 3-13 所示。
在这里插入图片描述
以上的关联可以用下面的代码表示:

public class User {
	...
	public void handleBookCard(BookCard bookcard) {
		...
	}
	...
}

在 Java 中依赖关系体现为局部变量、方法的参数,以及对静态方法的调用,也就是说,如果类A的某一个局部变量类型是类 B,那么类A就依赖于类 B。如果类A的一个方法包含有B类型的参数,或A调用了B中的一个静态方法,那么A都应该依赖于B。
如果B出现在A的实例变量中,那么依赖关系就会扩大为关联关系,因此,泛化关系>关联关系>依赖关系。

4.实现关系(Realization)–表示接口的实现
实现关系表示类对接口的实现关系。实现关系是从子类指向接口类的,实现的方向相反,如3-14 所示。
在这里插入图片描述
实现关系在 Java 语言中可以直接使用关键字 implements 表示,描述类与接口之间的实现。以上的实现可以表示为如下的代码:

public class ClassC implements Paremtlnterface {}
public class ClassD implements ParemtInterface {}

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

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

相关文章

【linux】自定义快捷命令/脚本

linux自定义快捷命令 场景自定义命令自定义脚本 场景 深度学习经常要切换到自己环境,conda activate mmagic,但是又不想每次重复打这么多字,想使用快捷命令直接切换。 自定义命令 使用别名(alias)或自定义脚本来创建…

【期末速成】——计算机组成原理(1)

目录 一、什么是计算机的组成 二、冯诺依曼体系结构计算机的特点 三、计算机系统的层次结构 四、机器语言、汇编语言、高级语言, 五、 编译程序、解释程序、汇编程序 六、已知主频、CPI计算程序运行时间 一、什么是计算机的组成 计算机的组成可以分为五个部件和两个信息…

10.Halcon3D点云和MESH的相互转换

1.实现效果 这个案例主要是想告诉我们,如何在点云数据(全是点)和MESH(网格数据)中转换,理论上说可以点云数据可以看作的离散的,而MESH网格数据可以看作是连续的。 上图展示了三个(其实是四个)空间中的3d对象,左边第一个是一个立方体,经过降采样之后的点云,中间的是…

systemctl 添加自定义系统服务

以 “启动、停止、重启” boa web server为例: 1. 编写系统服务脚本 编写一个符合系统服务规范的脚本。这个脚本通常描述了服务的启动、停止、重启等行为。你可以使用shell、C、C、Java等语言来编写这个脚本。 # boa_server_run.sh:#!/bin/bashset -e …

浅谈申请小程序地理位置权限的正确打开方式

小程序地理位置接口有什么功能? 这篇内容会教大家如何快速申请“获取当前的地理位置(onLocationChange)”接口,以便帮助大家顺利开通接口。以下内容是本人经历了多次的申请经历得出来的经验,来之不易,望大家…

基础—SQL—DQL(数据查询语言)分页查询

一、引言 上一篇博客学习了排序查询,这次来讲查询的最后一个部分:分页查询。 涉及到的关键字是:LIMIT 。 二、DQL—分页查询 对于分页,不管以后做的是传统的管理系统还是做互联网的项目,基本上都会遇到分页查询的操…

【C语言】常见的动态内存的错误

前言 在动态内存函数的使用过程中我们可能会遇到一些错误,这里将常见的错误进行总结。 对NULL解引用 请看以下代码: 可以看到,这时我们的malloc开辟是失败的,所以返回的是空指针NULL,而我们却没有进行检查&#xff0…

东莞酷得智能 组装机械狗电子玩具方案

这款机械狗玩具电子方案结合了现代电子技术和人工智能元素,旨在为用户提供一个高科技、互动性强的娱乐体验。通过不断的软件更新和硬件迭代,机械狗的功能将持续扩展。 一、功能特点: 1、自动巡游:机械狗能够自主在房间内巡游&am…

计算机组成原理-----实验1

实 验 报 告 实验一 基本运算器实验 1、实验目的 (一)了解运算器的组成结构; (二) 掌握运算器的工作原理; (三)熟悉运算器的数据传送通路; (四)按…

Amis源码构建 sdk版本

建议在linux环境下构建(mac环境下也可以),需要用到sh脚本(amis/build.sh)。 Js sdk打包是基于fis进行编译打包的,具体可见fis-conf.js: amis-master源码下载:https://github.com/baidu/amis g…

推荐几款优秀的文档加密软件 | 企业文件加密解决方案

在数字化时代,信息安全问题日益突出,文档加密软件成为了保护数据安全的重要手段。但是,市面上的文档加密软件种类繁多,功能各异,如何选择一款好用的文档加密软件成为了许多用户关注的焦点。本文将为大家提供一份实用的…

@Value 读取环境变量配置

在项目开发过程中,有必要使用一些灰色规则(即仅用于开发使用过程中的逻辑控制变量)。 比如,本地开发中,一些业务逻辑需要调用第三方代码,但又在本地调不通,怎么办。只能通过 if(本地开发) {mock…

手拉手springboot整合kafka发送消息

环境介绍技术栈springbootmybatis-plusmysqlrocketmq软件版本mysql8IDEAIntelliJ IDEA 2022.2.1JDK17Spring Boot3.1.7kafka2.13-3.7.0 创建topic时,若不指定topic的分区(Partition主题分区数)数量使,则默认为1个分区(partition) springboot加入依赖kafk…

HTML静态网页成品作业(HTML+CSS)——企业装饰公司介绍网页(4个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有4个页面。 二、作品演示 三、代…

热电子光探测器的电磁场空间分布与FDTD材料折射率的导出

仿真实例 金属薄膜中金纳米孔阵列透射与反射, 并考虑其近场电磁分布 利用脚本进行电磁场及其光学响应的可视化 设置EOT型超表面结构,以及Structure library的使用 结构的参数化扫描与结果可视化 利用脚本计算峰值增强因子 多层平面结构激发T…

Spark 核心编程之 RDD 介绍

一、Spark 分布式计算模拟 Driver 端将数据拆分成 n 个 Task 发送给 Executor,n 为 Executor 个数,Task 包含数据和计算逻辑,Executor 接收到 Task 后进行计算并将计算后的结果返回给 Driver 定义封装整体数据和逻辑的资源类 class Resource …

高性能服务器网络模型详解

1999年Dan Kegel在发表的论文中提出了The C10K problem,这篇论文对传统服务器架构处理大规模并发连接时的挑战进行了详细描述,并提出了一些解决方案和优化技术。这里的C指的是Concurrent(并发)的缩写,C10K问题是指怎么在单台服务器上并发一万…

buidldroot musl uclib库 编译

buildroot 修改 编译工具链 原本编译器相关信息: Incorrect selection of the C library buidroot编译 注意相关选项,后续使用CUSTOM TOOLCHAIN 时对应 UCLIB 能将生成IMAGE 从2.9K变为2.3K MUSL 能将生成IMAGE 从2.9K变为2.7K 变大了 arm-linux-…

【运维项目经历|025】企业高效邮件系统部署与运维项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的问题 问题1:项目周期为多长时间? 问题2:服务器部署架构方式及数量…

ubuntu 18.04 ros1学习

总结了一下,学习内容主要有: 1.ubuntu的基础命令 pwd: 获得当前路径 cd: 进入或者退出一个目录 ls:列举该文件夹下的所有文件名称 mv 移动一个文件到另一个目录中 cp 拷贝一个文件到另一个目录中 rm -r 删除文件 gedit sudo 给予管理员权限 sudo apt-…