MarkDown中写UML图的方法
目录
- 序
- UML图之顺序图
- 顺序图的四个要素
- 关于消息箭头的语法
- Mermaid中顺序图的简单例子
- 样例
- 用小人表示对象
- 为对象设置别名
- 激活对象
- UML图之类图
- 类图中常见的关系
- 关于不同类型关系的语法
- Mermaid中类图的简单例子
- 样例
- 类定义的两种方式
- 为类定义成员
- 双向关系的表示
- 多重性关系的表示
- UML之状态图
- 状态图的构成要素
- Mermaid中顺序图的简单例子
- 样例
- 状态的表示
- 转移的表示
- 开始和结束的表示
- 判断的表示
- 同步的表示
序
Mermaid(中译为美人鱼,就好比一条美人鱼在流动构成了各种的图),是一种在MarkDown中以特定格式的文字生成各种图示的方法。
接着之前写过的MarkDown中写流程图的方法这篇博客,经过了三年,Mermaid也是接连更新了软件工程中常用的顺序图、类图、状态图等UML图,E-R图以及项目管理中常用的甘特图、饼图,还有常用版本管理工具Git的合并策略图也可以画出来了!这真是为开发者们徒增不少便利啊!
只有你想不到,没有Mermaid做不到,当然这不是打广告!就连思维导图Mermaid也支持啦!虽然XMind用来画思维导图是更加方便的,不过多掌握一项技能又何尝不可呢!
这篇博客将为大家介绍如何绘制常见UML图,诸如顺序图、类图、状态图。
UML图之顺序图
顺序图又叫时序图、序列图,即以时间为主线,有生命线的动态视图,它显示了各个进程之间是如何运作的,以及它们是以什么顺序运作的。
顺序图的四个要素
①对象:类的实例化。
②生命线:对象存在的时间。
③消息:对象之间靠消息传递信息和指令,用从一个对象的生命线到另一个对象生命线的箭头表示消息。
④激活:这个时间,对象可以实现操作。对象存在时生命线用一条虚线表示,当对象的过程处于激活状态,生命线用双道线表示。
接下来介绍如何使用Mermaid画顺序图。
关于消息箭头的语法
| 消息箭头类型 | 表达含义 | 示意图 |
|---|---|---|
| -> | 不带箭头的实线 | / |
| --> | 不带箭头的点虚线 | / |
| ->> | 带箭头的实线 | ![]() |
| -->> | 带箭头的点虚线 | ![]() |
| -x | 尾部带十字叉的实线 | ![]() |
| --x | 尾部带十字叉的点虚线 | ![]() |
| -) | 尾部是开箭头的实线(异步) | ![]() |
| --) | 尾部是开箭头的点虚线(异步) | ![]() |
Mermaid中顺序图的简单例子
样例
在下面这段文字(代码块中)的前面和后面一行各自添加```(键盘左上,与~共用一个键)即可生成如下图的展示结果(注意在使用时需要增加mermaid标识,加在前面那三点的后面)。
sequenceDiagram学生->>老师: 老师,请问这道题的解题思路是什么?老师-->>学生: 来,你看这边,是这样的……学生-)老师: 醍醐灌顶!谢谢老师!!
注意:end这个词会与Mermaid语法冲突,如果必须要使用到,需将这样使用:(end) 或[ end ] 或{ end }.
用小人表示对象
上面的例子是用长方形和文字来表示一个对象的,如果要用更加形象的小人来表示对象,那么在使用对象前,用actor来声明即可。
sequenceDiagramactor 学生actor 老师学生->>老师: 老师好!老师-->>学生: 你好~
为对象设置别名
如果觉得对象名太长太复杂,那么可以使用participant···as···的语法为对象名设置一个简要的别名。
sequenceDiagramparticipant A as 学生participant B as 老师A->>B: 老师好!B-->>A: 你好~
这样画出来的图没有区别,但是写法上会简单很多。
激活对象
如果想要激活对象,那么使用activate;取消对象的激活状态,则使用deactivate。
sequenceDiagramactor A as 学生actor B as 系统A->>B: 录入信息activate BB-->>A: 更新信息deactivate B
可以使用+/-简化激活/未激活状态。
sequenceDiagramactor A as 学生actor B as 系统A->>+B: 录入信息B-->>-A: 更新信息
UML图之类图
在面向对象的模型中,类图常用来表达系统的类、属性、操作(又叫方法)以及类之间的关系。
类图中常见的关系
①泛化(Generalization):一种继承关系,即一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。
表示:带三角箭头的实线,箭头指向父类。
②实现(Realization):一种类与接口的关系,即类是接口所有特征和行为的实现。
表示:带三角箭头的虚线,箭头指向接口。
③关联(Association):一种拥有关系,它使一个类知道另一个类的属性和方法。
表示:带普通箭头的实心线,指向被拥有者。
④聚合(Aggregation):整体与部分的关系,且部分可以离开整体而单独存在。
注:聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语义上无法区分,必须考察具体的逻辑关系。
表示:带空心菱形的实心线,菱形指向整体。
⑤组合(Composition):整体与部分的关系,但部分不能离开整体而单独存在。
注:组合关系也是关联关系的一种,但相比于聚合,组合是一种更强的关联关系。
表示:带实心菱形的实线,菱形指向整体。
⑥依赖(Dependency):一种使用的关系,即一个类的实现需要另一个类的协助,因此尽量不要使用双向的互相依赖。
表示:带箭头的虚线,指向被使用者。
各种关系的强弱顺序:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
关于不同类型关系的语法
| 关系 | 表达含义 | 示意图 |
|---|---|---|
| <|-- | 继承 | ![]() |
| *-- | 组合 | ![]() |
| o-- | 聚合 | ![]() |
| --> | 关联 | ![]() |
| -- | 实线连接 | ![]() |
| ..> | 依赖 | ![]() |
| ..|> | 实现 | ![]() |
| .. | 虚线连接 | ![]() |
Mermaid中类图的简单例子
样例
在下面这段文字(代码块中)的前面和后面一行各自添加```(键盘左上,与~共用一个键)即可生成如下图的展示结果(注意在使用时需要增加mermaid标识,加在前面那三点的后面)。
classDiagram动物 ..< 水动物 ..< 氧气动物 <|-- 鸟鸟 <|-- 老鹰鸟 <|-- 白鹭鸟 <|-- 天鹅鸟 "1"*-->"2" 翅膀天鹅群"1"o-->"n"天鹅天鹅..|>飞翔白鹭"1"-->"1"气候动物: + 生命动物: + 性别动物: +新陈代谢(int 氧气,int 水)动物: +繁衍后代()飞翔: +飞()class 鸟{+羽毛+进食()+下蛋()}class 老鹰{-鹰眼视力-抓田鼠()-下蛋()}class 白鹭{+野生自然+捕鱼()+下蛋()}class 天鹅{+黑色与白色+捕鱼()+下蛋()}
类定义的两种方式
- 使用关键词
class来定义一个类。
如class Animal可以定义一个Animal的类:
classDiagramclass Animal
- 通过两个类之间的关系可以同时定义两个类。
如Vehicle <|-- Car表示Car类继承自Vehicle类:
classDiagramVehicle <|-- Car
需要注意的是,类名应该只由字母、数字、字符(包括Unicode)和下划线组成。
为类定义成员
类通常有其特有的属性和方法,方法用到的参数通常在后面用()括起来。
而属性与方法的访问级别修饰符表示通常在冒号后面用一个符号来表示,对应的关系如下表所示:
| 符号 | 访问级别修饰符 |
|---|---|
| + | Public |
| - | Private |
| # | Protected |
| ~ | Package/Internal |
如果想表示抽象方法或者是静态方法或静态变量,可以分别使用*和$符号标明:
- 抽象方法:
someAbstractMethod()* - 静态方法:
someStaticMethod()$ - 静态变量:
String someField$
同样的,有两种方法来定义类的成员:
- 在类后面使用
:,冒号后面跟类成员。这种方式适用于一次定义一个成员。
classDiagram
class Person
Person: +String name
Person: +int age
Person: +work(time) bool
Person: +study(time) int
- 使用
{}将类成员括起来。这种方式适用于一次定义多个成员。
classDiagram
class Person{+String name+int age+work(time) bool+study(time) int
}
注:如果方法有返回值,那么返回值类型可以在方法后加一个空格并加上其返回值类型。
如果成员变量中含有泛型,那么像List<int>是这样表示的:List~int~。即使用了~ ~来表示了< >。
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 : +getDistanceMatrix() List~List~int~~
双向关系的表示
关系可以表示逻辑上N:M的联系。
一个简单的例子如下:
classDiagramAnimal <|--|> Zebra
双向关系的语法格式:
[关系类型][连接][关系类型]
其中关系类型如下表所示:
| 关系类型 | 说明 |
|---|---|
<| | 继承 |
\* | 组合 |
o | 聚合 |
> | 关联 |
< | 关联 |
|> | 实现 |
其中连接如下表所示:
| 连接类型 | 说明 |
|---|---|
-- | 实线 |
.. | 虚线 |
多重性关系的表示
类图中的多重性或者叫基数表示一个类有多少实例可以与另一个类的实例形成关系。
不同的基数表示方法:
1:一个0..1:零个或一个1..*:一个或多个*:零个或多个n:n个0..n:零到n个1..n:一到n个
基数可以在箭头表示的关系左右加上引号和以上的基数表示:
classDiagramCustomer "1" --> "*" TicketStudent "1" --> "1..*" CourseGalaxy --> "many" Star : Contains
UML之状态图
状态图主要用于描述一个特定的对象的所有可能状态以及由于各种事件的发生而引起的状态之间的转换。
状态图的构成要素
状态(States):在对象的生命周期中满足某些条件、执行某些活动或等待某些事件的一个条件或状况。所有的对象都有状态,状态是对象执行了一系列活动的结果,当某个事件发生后,对象的状态将发生变化。
状态图中可以包含0个多个开始状态,也可以包含多个结束状态。模型不必同时具有开始和结束状态,因为模型可以总是运行,从不停止。转移(Transitions):两个状态之间的一种关系,表示对象将在第一个状态中执行一定的动作并在某个特定事件发生或某个特定条件满足时进入第二个状态。
事件:使状态发生变化的某时刻发生的动作或活动,用来指示是什么触发了转移从而导致状态发生了改变。事件通常在从一个状态到另一个状态的转移路径上直接指定。判断:判断点通过对事件判断分组转移到各自方向,提高了状态图的可视性。
同步:使用同步和活动图一样是为了说明并发工作流的分叉与联合。
注:状态图重点在与描述对象的状态及其状态之间的转移,与活动图区别在于状态图注重的是行为的结果,活动图更注重是行为的动作。
Mermaid中顺序图的简单例子
样例
在下面这段文字(代码块中)的前面和后面一行各自添加```(键盘左上,与~共用一个键)即可生成如下图的展示结果(注意在使用时需要增加mermaid标识,加在前面那三点的后面)。
stateDiagram[*] --> 用户登录用户登录 --> 登录成功:验证通过登录成功 --> 填写信息:注册新卡填写信息 --> 存入数据库:信息合理存入数据库--> 提示成功:保存成功提示成功 --> 退出系统:退出退出系统-->[*]
状态的表示
状态的表示有多种方式:
- 最简单的是用一个名字来定义一个状态:
stateDiagram-v2stateId
- 如果要简写状态名,则可以使用以下方式:
stateDiagram-v2state "StateA" as s1s1 -->StateB
这样在后续就可以直接使用s1来表示StateA了。
3. 简写状态名还可以用冒号的方式:
stateDiagram-v2s1 : StateAs1 -->StateB
转移的表示
转移使用箭头-->表示。
当在两个状态间定义一个转移时,这两个状态也同时会被定义。
stateDiagram-v2s1 --> s2
如果想在转移上添加文字,那么在后面加上一个冒号后写上想添加的文字即可。
stateDiagram-v2s1 --> s2: A transition
开始和结束的表示
在状态图中,开始和结束状态是两个特殊的状态。它们都用[*]来表示。
stateDiagram-v2[*] --> s1s1 --> [*]
判断的表示
如果状态图中涉及到了判断,那么可以使用<<choice>>来表示。
stateDiagram-v2state if_state <<choice>>[*] --> IsPositiveIsPositive --> if_stateif_state --> False: if n < 0if_state --> True : if n >= 0
同步的表示
对于同步的表示,则使用到了<<fork>>和<<join>>。
stateDiagram-v2state fork_state <<fork>>[*] --> fork_statefork_state --> State2fork_state --> State3state join_state <<join>>State2 --> join_stateState3 --> join_statejoin_state --> State4State4 --> [*]
相关文章:
MarkDown中写UML图的方法
目录序UML图之顺序图顺序图的四个要素关于消息箭头的语法Mermaid中顺序图的简单例子样例用小人表示对象为对象设置别名激活对象UML图之类图类图中常见的关系关于不同类型关系的语法Mermaid中类图的简单例子样例类定义的两种方式为类定义成员双向关系的表示多重性关系的表示UML之…...
Axure8设计—动态仪表盘
本次分享的的案例是Axure8制作的动态仪表盘,根据设置的数值,仪表盘指针旋转到相应的值位置 预览地址:https://2qiuwg.axshare.com 下载地址:https://download.csdn.net/download/weixin_43516258/87502161 一、制作原型 1、首先创建空白页…...
【C++】类和对象的六个默认成员函数
类的6个默认成员函数构造函数概念特性析构函数概念特性拷贝构造函数概念特征拷贝构造函数典型调用场景:赋值运算符重载运算符重载赋值运算符重载取地址及const取地址操作符重载类的6个默认成员函数 到底什么是类的6个默认成员函数呢?相信大家一定对此怀…...
4、算法MATLAB---认识矩阵
认识矩阵1、矩阵定义和基本运算1.1 赋值运算符:1.2 等号运算符:1.3 空矩阵1.4 一行一列矩阵1.5 行矩阵(元素用空格或逗号分隔)1.6 列矩阵(分号表示换行)1.7 m行n列的矩阵:行值用逗号间隔&#x…...
vue3+rust个人博客建站日记2-确定需求
反思 有人说过我们正在临近代码的终结点。很快,代码就会自动产生出来,不需要再人工编写。程序员完全没用了,因为商务人士可以从规约直接生成程序。 扯淡!我们永远抛不掉代码,因为代码呈现了需求的细节。在某些层面上&a…...
Linux安装云原生网关Kong/KongA
目录1 概述2 创建服务器3 安装postgres4 安装kong5 安装node6 安装KONGA1 概述 Kong Kong是一款基于OpenResty(NginxLua模块)编写的高可用、易扩展的开源API网关,专为云原生和云混合架构而建,并针对微服务和分布式架构进行了特别…...
Vue学习笔记(2)
2.1 事件处理 2.1.1 事件监听器 JavaScript:通过获取DOM对象再往DOM对象上使用addEventListener注册监听事件 const btn document.querySelector(#my-button) btn.addEventListener(click, function() {alert(点击事件!) })jQuery:通过$选择器绑定对象…...
2023年三月份图形化四级打卡试题
活动时间 从2023年3月1日至3月21日,每天一道编程题。 本次打卡的规则如下: 小朋友每天利用10~15分钟做一道编程题,遇到问题就来群内讨论,我来给大家答疑。 小朋友做完题目后,截图到朋友圈打卡并把打卡的截图发到活动群…...
Python操作Excel
Python中对Excel文件的操作包括:读、写、修改。如果要对其进行如上的操作需要导入Python的第三方模块:xlrd、xlwd、xlutils,其分别对应Python的读、写、修改的操作 一、安装Python的第三方模块 二、操作Excel的基本步骤 1、导入响对应的模…...
Codeforces Round #853 (Div. 2) C. Serval and Toxel‘s Arrays【统计次数,算贡献】
链接 传送门 分析 这道题想法其实很简单,样例的计算方法一定要看懂。以样例1为例,根据他的操作方法可以得到两个新的数组,和一个原来的数组,总共三个数组。 1 2 3 4 2 3 4 5 3 他们两两配对去重,求出总的value。由于每…...
微信小程序-1:比较两数的大小
程序来源》微信小程序开发教程(第二章) 主编:黄寿孟、易芳、陶延涛 ISBN: 9787566720788 程序运行结果: <!--index.wxml--> <view class"container"> <text>第一个数字:&…...
数据结构——树
深度优先/广度优先遍历深度优先:访问根节点对根节点的 children 挨个进行深度优先遍历const tree {val: "a",children: [{val: "b",children: [{val: "d",children: [],},{val: "e",children: [],},],},{val: "c&quo…...
【华为OD机试模拟题】用 C++ 实现 - 找到它(2023.Q1)
最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明找到它题目输入输出示例一输入输出示例二输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD …...
python中yield的使用
在 Python 中,yield 是一个关键字,它用于定义生成器函数。生成器函数是一个特殊的函数,可以返回一个迭代器,当生成器函数被调用时,它不会立即执行,而是返回一个生成器对象,通过迭代生成器对象可…...
GO进阶(4) 深入Go的内存管理
Go语言成为高生产力语言的原因之一自己管理内存:Go抛弃了C/C中的开发者管理内存的方式,实现了主动申请与主动释放管理,增加了逃逸分析和GC,将开发者从内存管理中释放出来,让开发者有更多的精力去关注软件设计ÿ…...
【C++】类与对象理解和学习(下)
放在专栏【C知识总结】,会持续更新,期待支持🌹建议先看完【C】类与对象理解和学习(上)【C】类与对象理解和学习(中)本章知识点概括Ⅰ本章知识点概括Ⅱ初始化列表前言在上一篇文章中,…...
【Neo4j】Spring Data Neo4j APi阅读随笔
引言 关于Spring boot整合Neo4j的官方api翻译&学习随笔 (TOC) 一、准备工作 1.注入依赖 <dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId></dependency>2.配置yml文件 这里是本…...
JVM内存模型简介
1 程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完。 ja…...
k8s如何给node添加标签
一、为什么需要标签? k8s集群如果由大量节点组成,可将节点打上对应的标签,然后通过标签进行筛选及查看,更好的进行资源对象的相关选择与匹配 二、怎么查看目前node上具有的标签 [rootmaster01 ~]# kubectl get node --show-labels NAME …...
【大数据Hive】Hive ddl语法使用详解
一、前言 使用过关系型数据库mysql的同学对mysql的ddl语法应该不陌生,使用ddl语言来创建数据库中的表、索引、视图、存储过程、触发器等,hive中也提供了类似ddl的语法。本篇将详细讲述hive中ddl的使用。 二、hive - ddl 整体概述 在Hive中,DA…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...













