Markdown 类图绘制详解

✍️作者简介:小北编程(专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向)
🐳博客主页: 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN
🔔如果文章对您有一定的帮助请👉关注✨、点赞👍、收藏📂、评论💬。
🔥如需转载请参考【转载须知】

文章目录

  • 一、前言
  • 二、基本语法
    • 类图的「类」
  • 三、定义一个类
  • 四、定义类的成员
    • 返回类型
    • 泛型
    • 返回类型
    • 可见性
  • 五、定义关系
    • 关系标签
    • 双向关系
  • 六、关系上的基数/多重性
  • 七、类的注解
  • 八、注释
  • 九、设置图的方向
  • 十、交互
  • 十一、使用场景实例
  • 十二、总结

一、前言

Markdown 的原生语法不支持绘制图形,但通过扩展模块,我们可以将一些格式化的文字渲染成我们需要的图形。常用的图形有 “流程图”、“时序图”、“类图”、“状态图”、“甘特图”、“饼图” 等。

本节将重点介绍如何通过 Mermaid 绘制「类图」。

类图(Class diagrams)用来描述系统中静态对象的内容和关系。

类图是一种面向对象的建模形式。它是应用系统结构的概念模型,通常与开发时的代码有严格的对应关系。类视图也可以用于数据建模。

二、基本语法

类图的「类」

在软件工程中,统一建模语言 (UML) 中的类图Class Diagram是一种静态结构图,它通过显示系统的类、它们的属性、操作 (或方法) 以及对象之间的关系来描述系统的结构。

类是类图中的核心组成,类的成员包括属性和方法,以及一些扩展信息。在类图中,一个类实例由三层组成:

UML提供了表示类成员的机制,例如属性和方法,以及关于它们的附加信息。

图中类的单个实例包含三个部分(compartment):

  • 顶部部分包含类名称。它以粗体和居中显示,第一个字母大写。它还可以包含描述类性质的可选注释文本。
  • 中间部分包含类的属性。左对齐,第一个字母小写。
  • 底部部分包含类可以执行的操作。左对齐,第一个字母小写。

语法示例

```mermaid
classDiagramclass 动物动物 : String 标签动物 : 吃()
```

效果如下:

​​

动物
String 标签
吃()

三、定义一个类

两种方式定义类:

  • 使用像诸如class Animal这样的关键字显式定义类。
  • 通过对象之间的关系定义两个类:Vehicle <|-- Car,这条语句定义了两个类,分别是车辆和汽车及其从属关系。

语法示例

```mermaid
classDiagramclass 动物交通工具 <|-- 小汽车
```

效果如下:

动物
交通工具
小汽车

命名约定:类名应由字母数字 (允许使用unicode) 和下划线字符组成。

四、定义类的成员

UML提供了表示类成员的机制,例如属性和方法,以及关于它们的附加信息。

Mermaid根据括号 () 是否存在来区分属性和函数/方法。带有 () 的被视为函数/方法,其他被视为属性。

定义类的成员有两种方法,无论使用哪种语法来定义成员,输出都是相同的。两种不同的方式是:

  • 使用 : 关联类的成员,在后面跟随成员名称,用于一次定义一个成员。例如:
```mermaid
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
```
BankAccount
+String owner
+BigDecimal balance
+deposit(amount)
+withdrawal(amount)
  • 使用{}关联类的成员,成员被分组在花括号中。适用于一次定义多个成员。例如:
```mermaid
classDiagram
class BankAccount{+String owner+BigDecimal balance+deposit(amount)+withdrawl(amount)
}
```
BankAccount
+String owner
+BigDecimal balance
+deposit(amount)
+withdrawl(amount)

返回类型

可选地,您可以在定义结束时设定返回的数据类型 (注意:最终的方法定义和返回类型之间必须有一个空格来结束方法/函数定义),示例:

```mermaid
classDiagram
class BankAccount{+String owner+BigDecimal balance+deposit(amount) bool+withdrawl(amount) int
}
```
BankAccount
+String owner
+BigDecimal balance
+deposit(amount) : bool
+withdrawl(amount) : int

泛型

可以使用通用类型(例如List<int>),对于字段、参数和返回类型,方法是将类型封装在~(波浪号)中。注意:当前不支持嵌套类型声明(例如List<List<int>>)。

这可以作为任何一个类定义方法的一部分来完成:

```mermaid
classDiagram
class Square~Shape~{int idList~int~ positionsetPoints(List~int~ points)getPoints() List~int~
}Square : -List~string~ messages
Square : +setMessages(List~string~ messages)
Square : +getMessages() List~string~
```
Square<Shape>
int id
List<int> position
-List<string> messages
setPoints(List<int> points)
getPoints() : List<int>
+setMessages(List<string> messages)
+getMessages() : List<string>

返回类型

(可选) 您可以使用返回类型来结束方法/函数的定义。

可见性

要指定类成员(即任何属性或方法)的可见性,可以将这些符号放在成员名称之前(可选):

  • + 公共Public
  • - 私有Private
  • # 保护Protected
  • ~ 包/内部Package/Internal

注意:您还可以通过在方法的末尾添加以下符号来将其他分类器包含到方法定义中,例如,在 () 之后:

  • * Abstract 例如:someAbstractMethod()*
  • $ Static例如:someStaticMethod()$

注意:您还可以通过在字段名称的末尾添加以下符号来将其他分类器包含到字段定义中:

  • $ Static 例如:String someField$

五、定义关系

关系是一个通用术语,涵盖在类和对象图上找到的特定类型的逻辑关系。

类图中「类」之间的逻辑关系由连接线表示,定义的形式如:[类A][箭头][类B]:标签文字。

不同的逻辑关系定义如下:

类型定义
<|--继承
\*--.组合
o--.聚合
-->.关联
--.连接(实线)
..>.依赖
..|>实现
...连接(虚线)
```mermaid
classDiagramclassA <|-- classBclassC *-- classDclassE o-- classFclassG <-- classHclassI -- classJclassK <.. classLclassM <|.. classNclassO .. classP
```
classA
classB
classC
classD
classE
classF
classG
classH
classI
classJ
classK
classL
classM
classN
classO
classP
```mermaid
classDiagramclassA --|> classB : InheritanceclassC --* classD : CompositionclassE --o classF : AggregationclassG --> classH : AssociationclassI -- classJ : Link(Solid)classK ..> classL : DependencyclassM ..|> classN : RealizationclassO .. classP : Link(Dashed)
```
Inheritance
Composition
Aggregation
Association
Link(Solid)
Dependency
Realization
Link(Dashed)
classA
classB
classC
classD
classE
classF
classG
classH
classI
classJ
classK
classL
classM
classN
classO
classP

关系标签

可以将标签式的文本添加到关系上:

[classA][Arrow][ClassB]:LabelText
```mermaid
classDiagram类A <|-- 类B : 实现类C *-- 类D : 组合类E o-- 类F : 聚合
```
实现
组合
聚合
类A
类B
类C
类D
类E
类F

双向关系

关系可以逻辑上表示 N:M 的关联:

```mermaid
classDiagram动物 <|--|> 斑马
```
动物
斑马

语法:

[关系类型][链接][关系类型]

其中,“关系类型”可以是以下之一:

其中Relation Type可以是以下之一:

类型说明
<|.继承
\*.组合
o.聚合
>.关联
<.关联
|>.实现

以及Link 可以是以下之一:

类型说明
--实线
...虚线

六、关系上的基数/多重性

类图中的多重性或基数表示一个类连接到另一个类的一个实例的实例数。例如,一家公司将有一名或多名员工,但每个员工只为一家公司工作。

多重性符号放置在关联的末尾。

不同的基数选项有:

  • 1 仅1个
  • 0..1 0或者1个
  • 1..* 1个或多个
  • * 多个
  • n n个(n>1)
  • 0..n 0-n个(n>1)
  • 1..n 1-n个(n>1)

通过在给定箭头之前(可选)和之后(可选)在 "" 内放置基数文本,可以轻松定义基数。

[类A] "基数1" [箭头] "基数2" [类B]:标签文本
```mermaid
classDiagram
消费者 "1" --> "*" 消费券
学生 "1" --> "1…*" 课程
星系 --> "许多的" 星星 : 包含
```
1
*
1
1…*
包含
许多的
消费者
消费券
学生
课程
星系
星星

七、类的注解

可以使用标记对类进行说明,以提供关于类的其他元数据。这可以更清楚地指示其属性。一些常见的说明包括:

<<Interface>> 表示接口
<<Abstract>> 表示抽象
<<Service>> 表示服务
<<Enumeration>> 表示枚举

注解在 <<>> 中定义。有两种方法可以向类添加注解,无论使用哪种语法,输出相同。这两种方式是:

  • 在定义类之后的单独行中定义。例如:
```mermaid
classDiagramclass 形状<<interface>> 形状形状 : 顶点数形状 : `绘制()
```
«interface»
形状
顶点数
绘制()
  • 在类定义的嵌套结构中定义。例如:
```mermaid
classDiagram
class 形状{<<接口>>顶点数绘制()
}
class 颜色{<<枚举>>红蓝黄
}
```
«接口»
形状
顶点数
制()
«枚举»
颜色

八、注释

注释可以在类图代码中使用,解析器将忽略这些注释。注释需要写在单独的一行里并且必须以 %% 开头。注释开始到下一个换行符之后的任何文本都将被视为注释,包括任何类图语法。

```mermaid
classDiagram
%% 整行都是注释 classDiagram class 形状 <<接口>>
class 形状{<<接口>>顶点数`绘制()
}
```
«接口»
形状
顶点数
绘制()

九、设置图的方向

对于类图,您可以使用方向语句来设置图将呈现的方向,就像本示例中的那样:

```mermaid
classDiagram
direction RL
class 学生 {-身份证 : 身份证信息
}
class 身份证信息{-序号 : int-名称 : string
}
class 自行车信息{-序号 : int-名称 : string
}
学生 "1" --o "1" 身份证信息 : 拿
学生 "1" --o "1" 自行车信息 : 骑
```
1
1
1
1
学生
-身份证 : 身份证信息
身份证信息
-序号 : int
-名称 : string
自行车信息
-序号 : int
-名称 : string

十、交互

可以将单击事件绑定到节点,单击可以打开链接,该链接将在新的浏览器选项卡中打开。

声明所有类后,可以另起一行定义这些操作:

action className "reference" "tooltip"
click className href "url" "tooltip"
  • action可以是link
  • className 是类的名称
  • reference 可以是一个URL链接
  • (可选)tooltip是一段鼠标悬浮后显示的文本

示例

```mermaid
classDiagram
class Shapelink Shape "http://www.github.com" "This is a tooltip for a link"
class Shape2click Shape2 href "http://www.github.com" "This is a tooltip for a link"
```
Shape
Shape2

您可以使用 note "第一行\n第二行" 在图表上添加注释。也可以使用: note for <类名> "第一行\n第二行" 为特定的类添加注释。

十一、使用场景实例

类图主要用于为系统建模。

示例代码

```mermaid
classDiagram鸟 --|> 动物 : 继承翅膀 "2" --|> "1" 鸟 : 组合动物 ..> 氧气 : 依赖动物 ..> 水 : 依赖、class 动物 {<<interface>>+有生命+新陈代谢(氧气, 水)+繁殖()}class 鸟 {+羽毛+有角质喙没有牙齿+下蛋()}class 鸟 {+羽毛+有角质喙没有牙齿+下蛋()}
```
继承
组合
2
1
依赖
依赖、
+羽毛
+有角质喙没有牙齿
+羽毛
+有角质喙没有牙齿
+下蛋()
+下蛋()
«interface»
动物
+有生命
+新陈代谢(氧气, 水)
+繁殖()
翅膀
氧气

十二、总结

Mermaid 方法渲染的类图包含图表类型声明、类、关系;
Mermaid 类图支持类名、成员的定义,并可以为成员声明修饰符及类型元数据;
Mermaid 支持多种类型的关系,可以为关系增加标签文本,可以增加基数描述。

请添加图片描述

文章写作不易,您的支持是我最大的动力,请👉关注✨、点赞👍、收藏📂、评论💬。

无论是哪个阶段,坚持努力都是成功的关键。不要停下脚步,继续前行,即使前路崎岖,也请保持乐观和勇气。相信自己的能力,你所追求的目标定会在不久的将来实现。加油!

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

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

相关文章

水电站智能监测泄洪预警系统介绍

一、背景 近年来由于危险河道管理措施不到位&#xff0c;调峰电站泄水风险长期存在&#xff0c;信息通报制度缺失以及民众安全警觉性不高等因素导致的水电站在泄洪时冲走下游河道游客以及人民财产的事故频发。 二、系统介绍 水电站智能监测泄洪预警系统是一种集成了物联网、云…

ElasticSearch的常用增删改查DSL和代码

es增删改查常用语法 我们日常开发中&#xff0c;操作数据库写sql倒是不可能忘记&#xff0c;但是操作es的dsl语句有时候很容易忘记&#xff0c;特地记录一下方便查找。 DSL语句 1、创建索引 -- 创建索引 PUT /my_index {"mappings": {"properties": {&…

GEE中Landsat、Sentinel、Modis主要数据集区别

一、Landsat 1. Collection 1/2 的区别 Collection 2 是Landsat Level 1 数据的又一次重大再处理&#xff0c;显著提高了绝对地理定位精度。 Collection1Collection2时间跨度1972~2021底1972~至今数据等级level 1level1&#xff1a;1972~2021底 level2&#xff1a;1982~至今 …

路由器初始化配置、功能配置

实验环境 拓扑图 Ip规划表&#xff08;各组使用自己的IP规划表&#xff09; 部门 主机数量 网络地址 子网掩码 网关 可用ip Vlan 市场部 38 192.168.131.0 255.255.255.0 192.168.131.1 2-254 11 研发部 53 192.168.132.0 255.255.255.0 192.168.132.1 2-2…

Oracle21C + PLSQL Developer 15 + Oracle客户端21安装配置完整图文版

一、Oracle21C PLSQL Developer 15 Oracle客户端文件下载 1、Oracl21C下载地址&#xff1a;Database Software Downloads | Oracle 中国 2、 PLSQL Developer 15下载地址&#xff1a;Registered download PL/SQL Developer - Allround Automations 3、 Oracle 客户端下载地址…

全球光伏知名企业-晶科能源联合泛微采知连,建立文控管理平台

晶科能源股份有限公司&#xff08;简称“晶科能源”&#xff09;是一家全球知名、极具创新力的太阳能科技企业。 &#xff08;图片素材来自晶科能源官网&#xff09; 公司战略性布局光伏产业链核心环节&#xff0c;聚焦光伏产品一体化研发制造和清洁能源整体解决方案提供&…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--具身智能、强化学习

专属领域论文订阅 VX关注 晓理紫&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 分类: 大语言模型LLM视觉模型VLM扩散模型视觉导航具身智能&#xff0c;机器人强化学习开放词汇&#xff0c;检测分割 [晓理紫]每日论文分享…

【LabVIEW FPGA入门】FPGA中的数学运算

数值控件选板上的大部分数学函数都支持整数或定点数据类型&#xff0c;但是需要请注意&#xff0c;避免使用乘法、除法、倒数、平方根等函数&#xff0c;此类函数比较占用FPGA资源&#xff0c;且如果使用的是定点数据或单精度浮点数据仅适用于FPGA终端。 1.整数运算 支持的数…

【Java】IDEA中的JFormDesigner使用教程

目录 1 安装 JFormDesigner 插件2 JFormDesigner 使用教程2.1 新建JFormDesigner Form时的选项2.2 JFormDesigner Form界面布局2.3 JFormDesigner 组件2.3.1 Components基本组件2.3.2 Containers中间容器&#xff08;面板&#xff09;2.3.3 Windows顶级容器&#xff08;窗口&am…

给科研人的 ML 开源发布工具包

什么是开源发布工具包&#xff1f; 恭喜你的论文成功发表&#xff0c;这是一个巨大的成就&#xff01;你的研究成果将为学界做出贡献。 其实除了发表论文之外&#xff0c;你还可以通过发布研究的其他部分&#xff0c;如代码、数据集、模型等&#xff0c;来增加研究的可见度和采…

【从0上手cornerstone3D】如何加载nifti格式的文件

在线演示 支持加载的文件格式 .nii .nii.gz 代码实现 npm install cornerstonejs/nifti-volume-loader// ------------- 核心代码 Start------------------- // 注册一个nifti格式的加载器 volumeLoader.registerVolumeLoader("nifti",cornerstoneNiftiImageVolu…

Qt/C++编写视频监控系统83-自定义悬浮条信息

一、前言 一般视频控件上会给出个悬浮条&#xff0c;这个悬浮条用于显示分辨率或者一些用户期望看到的信息&#xff0c;一般常用的信息除了分辨率以外&#xff0c;还有帧率、封装格式、视频解码器名称、音频解码器名称、实时码率等&#xff0c;由于实际的场景不一样&#xff0…

el-date-picker默认结束为当前时分秒

在element ui中的日期时间选择组件中默认是00:00,现在需求是点击默认结束时间为当前时分秒&#xff0c;查了很多资料写的都不准确 需求&#xff1a;实现日期时间组件可选择当前日期&#xff0c;比如当前是2024年01月17号下午17&#xff1a;21 那选中时必须结束时间为17&#x…

页面数据类型为json,后端接受json数据

项目结构 依赖pom.xml <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.8.RELEASE</version></dependency><dependency><groupId>org.springframework…

小白准备蓝桥杯之旅(c/c++b组)

前言&#xff1a;省赛获奖比例高达百分之60,只要比一半的人努力&#xff0c;你就能大概率获奖。 寒假做的3件事 1.稳基础 熟练掌握基础语法部分&#xff0c;c比c多个stl库优势&#xff0c;c语言的同学需要会实现c中stl库部分 2.刷真题 大概比赛前30天&#xff0c;坚持每天做…

Redis集群优化

文章目录 前言集群完整性问题集群带宽问题 前言 集群虽然具备高可用特性&#xff0c;能实现自动故障修复&#xff0c;但是如果使用不当&#xff0c;也会存在一些问题 集群完整性问题集群带宽问题数据倾泻问题客户端性能问题命令的集群兼容性问题Lua和事务问题 集群完整性问题…

低代码配置-属性配置面板设计

模块设计 tab项切换 组件基础属性组件数据属性组件事件属性表单属性 模块输出函数设计 tab切换函数 列表表单属性 数据来源&#xff1a; 调用接口时一次赋予&#xff0c;无需使用selectItem&#xff0c;如需使用&#xff0c;归入基础属性列表标题是否展示筛选区域 示例&am…

输入框输入关键字 下拉框的关键字高亮

直接上代码 //搜索框部分 <div><input v-modelkeyWord /><button clickseachFn>搜索</button> </div> //下拉框部分 <div><div v-html"item.name" v-foritem in droplist :keyitem.id></div> </div> <sc…

centos环境下安装nginx+简单使用nginx

参考&#xff1a; https://www.cnblogs.com/chaofanq/p/15022916.html Nginx安装使用教程 - 简书 1.安装 1.1 下载一下 nginx: download 选择稳定版本下载 1.2 上传到虚拟机 cd /usr/local/src/ 1.3 进入目录开始解压 tar -xvf nginx-1.24.0.tar.gz 1.4 安装 cd nginx…

我帮企业找市场|福田供应链企业走进佛山,刮起“两业融合”新旋风!

前言&#xff1a; 2023年以来&#xff0c;福田区锚定高质量发展首要任务&#xff0c;鼓实劲、出实招、求实效&#xff0c;继推出“万名干部助企行”“我帮企业找市场”“我帮企业找资金”等系列服务举措后&#xff0c;坚持系统、全面完善产业支持政策&#xff0c;打造产业发展最…