PlantUML——类图

背景

类图是UML模型中的静态视图,其主要作用包括:

  • 描述系统的结构化设计,显示出类、接口以及它们之间的静态结构和关系。
  • 简化对系统的理解,是系统分析与设计阶段的重要产物,也是系统编码和测试的重要模型依据。

在UML中,一个类通常由名称、属性和操作等构成,除此之外,类的构成还包含类的职责、约束和注释等信息。

使用

创建plantUML文件

在PlantUML中,要创建类图,首先我们要创建一个plantUML文件,选择class类型

创建完成后,会自动生成一个模板文件供我们参考。

类的定义

在UML的类图中,一般我们需要表示出一个类各个字段的可见性,UML中可见性和符号的对应关系如下:

可见性符号
public+
package private~
protected#
private-

在Java中,类用class关键字、接口使用interface关键字,而抽象类使用abstract class,枚举类使用enum。在PlantUML中,我们同样可用用class、interface、abstract class和enum来分别表示出类、接口、抽象类和枚举。

如下图所示,我们定义了Person类,其中Person类有id、name、birthday属性,并且它们的可见性为private,此外,含有getId、getName和getBirthday这些public方法。然后还定义了Car接口和List抽象类,最后定义了一个Size枚举类,这个枚举类包含SMALL、MEDIUM、LARGE和EXTRA_LARGE这些实例。

@startumlclass Person {- id- name- birthday+ getId()+ getName()+ getBirthday()
}interface Car abstract class Listenum Size{SMALLMEIDUMLARGEEXTRA_LARGE
}@enduml

在这里插入图片描述

类型关系

在UML中,类与类之间,包含以下6种关系:

关系plantUML表示描述
泛化(Generalization)>
实现(Realization)>
关联(Association)–>关联关系表示“拥有”,相比依赖关系的临时性和单向性,关联关系具有长期性、平等性(可双向),所以关联表示的关系比依赖更强。
聚合(Aggregation)–o聚合关系相对组合弱一些,在聚合关系中,整体与部分是可分离的,比如学校和学生,一个学校有多个学生,当学生毕业后,学校仍然存在,不受影响,而学生实体也不会因为离开学校而被销毁。
组合(Composition)–*在组合关系中,整体与部分是不可分离的,整体与部分的生命周期保持一致,比如人体和四肢,就是一种典型的组合关系。
依赖(Dependency)…>依赖表示使用关系,在java中,被依赖的类,一般以方法参数、局部变量和静态方法调用等形式出现

以下图为例,Student继承于Person类,然后Student的study方法中,会以Book作为参数,因此,Student和Book之间是依赖关系。然后List接口有两个实现——AbstractList和AbstractLinkedList,因此,它们之间是实现关系,而ArrayList继承自AbstractList,因此它们之间是泛化关系。最后,一个学校有多个学生,学校和学生之间是聚合关系。

@startumlclass Person {- id- name- birthday+ getId()+ getName()+ getBirthday()
}class Student {- grade+ getGrade()+ study(Book book)
}class Book {
}Person <|-- StudentStudent ..> Bookinterface List
abstract class AbstractList
abstract class AbstractLinkedListAbstractList ..|> List
AbstractLinkedList ..|> Listclass ArrayList
class LinkedListArrayList --|> AbstractList
LinkedList --|> AbstractLinkedListclass School {- List<Student> student
}Student --o School@enduml

在这里插入图片描述

箭头方向

在上面的类图中,我们发现这个箭头方向有时候指向上面,有时候指向下面,当我们需要对箭头方向进行调整时,

可以使用up、down、left和right来表示。以下代码为例,表示School的上面是Person,School的右边是School

Student -up-|> Person
Student -right-o School
@startumlclass Person {- id- name- birthday+ getId()+ getName()+ getBirthday()
}class Student {- grade+ getGrade()+ study(Book book)
}class Book {
}Student -up-|> Person
Student .left.> Bookinterface List
abstract class AbstractList
abstract class AbstractLinkedListAbstractList .up.|> List
AbstractLinkedList .up.|> Listclass ArrayList
class LinkedListArrayList -up-|> AbstractList
LinkedList -up-|> AbstractLinkedListclass School {- List<Student> student
}Student -right-o School@enduml

在这里插入图片描述

颜色

在PlantUML中,我们可以对相关的元素去设置对应的颜色,其语法也很简单,就是在类的声明后面,加上颜色的定义,比如说我们想设置Person为红色,Student为绿色,那么定义如下:

class Person #red {- id- name- birthday+ getId()+ getName()+ getBirthday()
}class Student #green {- grade+ getGrade()+ study(Book book)
}

对于类与类之间的连线,同样可以设置对应的颜色,比如我们希望类与类之间颜色为蓝色,那么可以在右边加上对应的颜色定义,示例如下:

Student -up-|> Person #blue
Student .left.> Book #blue
@startumlclass Person #red {- id- name- birthday+ getId()+ getName()+ getBirthday()
}class Student #green {- grade+ getGrade()+ study(Book book)
}class Book #6ACCEF {
}Student -up-|> Person #blue
Student .left.> Book #blueinterface List #6ACCEF
abstract class AbstractList #6ACCEF
abstract class AbstractLinkedList #6ACCEFAbstractList .up.|> List #blue
AbstractLinkedList .up.|> List #blueclass ArrayList #6ACCEF
class LinkedList #6ACCEFArrayList -up-|> AbstractList #blue
LinkedList -up-|> AbstractLinkedList #blueclass School #6ACCEF{- List<Student> student
}Student -right-o School #blue@enduml

在这里插入图片描述

包图

在我们的类图中,有时候这些类散落在不同的包下,因此,我们需要定义包图,来反映这些类归属于哪些包和这些包之间的依赖关系,包的声明很简单,使用package关键字接口,示例如下:

package com.yang {
}

声明包之后,我们将类的定义,写在对应的包代码块下,以表示这个类归属于当前包。

@startumlpackage com.yang.model #orange{class Person #red {- id- name- birthday+ getId()+ getName()+ getBirthday()}class Student #green {- grade+ getGrade()+ study(Book book)}
}package com.yang.valueobject #grey{class Book #6ACCEF {}class School #6ACCEF{- List<Student> student}
}
package java.util {interface List #6ACCEFabstract class AbstractList #6ACCEFabstract class AbstractLinkedList #6ACCEFclass ArrayList #6ACCEFclass LinkedList #6ACCEF
}Student -up-|> Person #blue
Student .left.> Book #blueAbstractList .up.|> List #blue
AbstractLinkedList .up.|> List #blueArrayList -up-|> AbstractList #blue
LinkedList -up-|> AbstractLinkedList #blueStudent -right-o School #blue@enduml

在这里插入图片描述

参考文档

https://blog.csdn.net/zhangwei_david/article/details/125477021

https://blog.csdn.net/vitaviva/article/details/120639074

https://www.cnblogs.com/lanqiu5ge/p/9502419.html

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW热阻炉温度控制

在工业自动化和控制系统领域&#xff0c;温度的精确控制对于保障生产过程的稳定性和产品质量非常重要。热阻炉作为一个典型的受控对象&#xff0c;其温度控制系统的设计和实现涉及多个技术层面&#xff0c;包括硬件选择、控制策略的设计以及软件的实现。项目使用LabVIEW软件开发…

MongoDB在自动化设备上的应用示例

发现MongoDB特别适合自动化检测数据的存储。。。 例如一个晶圆检测项目&#xff0c;定义其数据结构如下 #pragma once #include <vector> #include <QString> #include <QRectF> #include <string> #include <memory>class tpoWafer; class tp…

day04-产品原型-学习计划

1. 分析整体业务流程 2. 提交学习记录-接口 2.1 需求 在课程学习页面播放视频时或考试后&#xff0c;需要提交学习记录到服务器保存&#xff0c;如用户播放视频的进度、学过的章节等。 2.1 接口详情 请求方式&#xff1a;POST 请求路径&#xff1a;/learning-record 请求…

基于Matlab的卷积神经网络(CNN)苹果分级检测系统

本研究提出了一种基于卷积神经网络&#xff08;CNN&#xff09;的自动化苹果分级系统&#xff0c;该系统根据苹果的视觉特征进行分类。系统采用了预训练的深度学习模型&#xff0c;使用包含不同等级苹果的图像数据集进行训练。研究方法包括图像预处理、特征提取和苹果等级分类。…

MySQL内置函数学习

引言 MySQL内置函数是MySQL数据库系统提供的预定义函数&#xff0c;用于执行特定的操作&#xff0c;如数学计算、字符串处理、日期和时间操作等。这些函数极大地简化了SQL语句的编写&#xff0c;提高了数据库操作的效率。 MySQL内置函数分类 MySQL内置函数可以大致分为以下几…

小程序入门学习(四)之全局配置

一、 全局配置文件及常用的配置项 小程序根目录下的 app.json 文件是小程序的全局配置文件。常用的配置项如下&#xff1a; pages&#xff1a;记录当前小程序所有页面的存放路径 window&#xff1a;全局设置小程序窗口的外观 tabBar&#xff1a;设置小程序底部的 tabBar 效…

【Web】AlpacaHack Round 7 (Web) 题解

Treasure Hunt flag在md5值拼接flagtxt的文件里&#xff0c;如 d/4/1/d/8/c/d/9/8/f/0/0/b/2/0/4/e/9/8/0/0/9/9/8/e/c/f/8/4/2/7/e/f/l/a/g/t/x/t 访问已经存在的目录状态码是301 访问不存在的目录状态码是404 基于此差异可以写爆破脚本 这段waf可以用url编码绕过 做个lab …

android studio 读写文件操作(应用场景三)

android studio版本&#xff1a;2023.3.1 patch2 例程&#xff1a;filesaveandread 其实我写这个都是我记录我要做后个数独小游戏&#xff0c;每一个都是为了解决一个问题。即是分享也是备忘&#xff0c;反正我什么都不会&#xff0c;就是一顿瞎改&#xff0c;不行就研究。这…

c++:timer

1.设置休眠时间sleep_for 添加头文件 #include <thread> #include <iostream> #include <chrono> #include <thread>int main(int argc, char const *argv[]) {// 休眠2秒std::this_thread::sleep_for(std::chrono::seconds(2));// 休眠500毫秒std:…

【开源】A064—基于JAVA的民族婚纱预定系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

嵌入式学习(17)-stm32F407串口使用注意事项

一、概述 配置串口时串口的接收一直不好使&#xff0c;对比例程发现了问题&#xff1a; 在网上也找了一些资料供参考“STM32F4的串口RX引脚不能被设置为输入是因为串口的接收&#xff08;RX&#xff09;功能是由硬件电路实现的&#xff0c;无法通过软件配置来控制。串口接收功…

如何在UI自动化测试中创建稳定的定位器?

如何在UI自动化测试中创建稳定的定位器&#xff1f; 前言1. 避免使用绝对路径2. 避免在定位器中使用索引3. 避免多个类名的定位器4. 避免动态和自动生成的ID5. 确保定位器唯一6. 处理隐藏元素的策略7. 谨慎使用基于文本的定位器8. 使用AI创建稳定的定位器 总结 前言 在自动化测…

在做题中学习(77):快排

解法&#xff1a;快排 思路&#xff1a; 1.快排排一趟&#xff0c;递归分出来的左区间和右区间&#xff08;一趟的思想&#xff0c;看我的前一个文章&#xff1a;颜色分类题解&#xff09; 2.递归&#xff1a;想清楚 函数头 和 返回条件怎么写 函数头&#xff1a;把递归想成…

数学拯救世界(二)——— 学艺

一、 然而&#xff0c;袁qy大臣又犯难了&#xff0c;他在想&#xff0c;如何把分数与国人知道的小数或者整数联系在一起呢&#xff1f;如果直接告诉国王分数是自己是造出来的&#xff0c;那么可能会导致国王发怒。 “可恶而又死板的暴君&#xff0c;不愿意接受任何新东西”&…

【RK3562J开发笔记】MCP2518FD外部CAN-FD控制器的调试方法

“SPI转CAN-FD”是嵌入式开发领域的常用方法&#xff0c;它极大地促进了不同通信接口之间的无缝连接&#xff0c;并显著降低了系统设计的复杂性。飞凌嵌入式依托瑞芯微RK3562J处理器打造的OK3562J-C开发板因为内置了SPI转CAN-FD驱动&#xff0c;从而原生支持这一功能。该开发板…

Next.js系统性教学:服务器操作与数据变更

更多有关Next.js教程&#xff0c;请查阅&#xff1a; 【目录】Next.js 独立开发系列教程-CSDN博客 目录 1. 什么是服务器操作和数据变更&#xff1f; 1.1 服务器操作 (Server Actions) 1.2 数据变更 (Mutations) 2. Next.js中的服务器操作与数据变更 2.1 引入&#xff1a…

Appium 安装问题汇总

好生气好生气&#xff0c;装了几天了&#xff0c; opencv4nodejs 和 mjpeg-consumer 就是装不了&#xff0c;气死我了不管了&#xff0c;等后面会装的时候再来完善&#xff0c;气死了气死了。 目录 前言 1、apkanalyzer.bat 2、opencv4nodejs 3、ffmpeg 4、mjpeg-consume…

MCU、ARM体系结构,单片机基础,单片机操作

计算机基础 计算机的组成 输入设备、输出设备、存储器、运算器、控制器 输入设备&#xff1a;将其他信号转换为计算机可以识别的信号&#xff08;电信号&#xff09;。输出设备&#xff1a;将电信号&#xff08;&#xff10;、&#xff11;&#xff09;转为人或其他设备能理解的…

ArrayList常见操作源码逐句剖析

目录 前言 正文 1.需要了解的一些字段属性 1.存储 ArrayList 元素的数组缓冲区。 2.集合的大小 3.默认集合容量大小 2.ArrayList对象创建 1.无参构造 2.有参构造1 3.有参构造2 3.添加元素add(E e)以及扩容机制 ​编辑 4.添加元素add&#xff08;int index,E element…

【Linux从青铜到王者】数据链路层(mac,arp)以及ip分片

局域网通信 通过之前的学习&#xff0c;我们了解了应用层&#xff0c;传输层&#xff0c;网络层的协议和作用&#xff0c;这里先做个总结 应用层——http&#xff0c;https协议&#xff0c;也可以自己定义一套&#xff0c;作用是进行数据的处理传输层——tcp&#xff0c;udp协…