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…...

Connext DDS录制服务 Recording Service(2)
2.4 远程管理 控制客户端(如RTI管理控制台)可以使用此接口远程控制录制服务。 注:记录服务远程管理基于第10.3节中描述的RTI远程管理平台。有关录制服务中远程管理工作的详细讨论,请参阅该手册 下面是所有支持操作的API引用。 2.4.1 启用远程管理 默认情况下,在录制服务中…...

mysql数据类型选择
数据类型选择 完整性约束 是完整性约束是为保证数据库中数据的正确性和相容性,对关系模型提出的某种约束条件或规则。 通常包括:实体完整性约束、参照完整性约束、域完整性约束、用户自定义完整性约束。 实体完整性(Entity integrity)是指主键必须非空…...

【Java】Spring Boot 配置文件
文章目录SpringBoot 配置文件1. 配置文件的作用2. 配置文件的格式3. properties配置文件说明3.1 properties基本语法3.2 读取配置文件3.3 properties缺点分析4. yml配置文件说明4.1 yml基本语法4.2 yml使用进阶4.2.1 yml配置不同的数据类型及null4.2.1 yml配置的读取4.2.2 配置…...
AtCoder Beginner Contest 290 G. Edge Elimination(思维题 枚举+贪心)
题目 T(T<100)组样例,每次给出一棵深度为d的k叉树, 其中,第i层深的节点个数为 保证k叉树的所有节点个数tot不超过1e18, 求在k叉树上构建一棵大小恰为x的连通块,所需要断开的最少的树边的条数(x<tot<1e18)…...

数据挖掘概述
目录1、数据挖掘概述2、数据挖掘常用库3、模型介绍3.1 分类3.2 聚类3.3 回归3.4 关联3.5 模型集成4、模型评估ROC 曲线5、模型应用1、数据挖掘概述 数据挖掘:寻找数据中隐含的知识并用于产生商业价值 数据挖掘产生原因:海量数据、维度众多、问题复杂 数…...

linux kernel iio 架构
linux kernel iio 架构讲解Linux IIO(Industrial I/O)架构是Linux内核提供的一种用于支持各种类型传感器和数据采集设备的子系统,包括温度、压力、湿度、加速度、光度等多种传感器。IIO架构的核心是一个通用的IIO子系统,它提供了一…...

Socket通信详解
Socket通信详解 文章目录Socket通信详解Socket流程介绍函数介绍编程实例Socket流程介绍 socket通信类似于电话通信,其服务器基本流程就是 Created with Raphal 2.3.0安装电话socket()分配电话号码bind()连接电话线listen()拿起话筒accept()函数介绍 socket() 其中…...

多分类、正则化问题
多分类问题 利用逻辑回归解决多分类问题,假如有一个训练集,有 3 个类别,分别为三角形 𝑦 1,方框𝑦 2,圆圈 𝑦 3。我们下面要做的就是使用一个训练集,将其分成 3 个二…...

史上最全面的软件测试面试题总结(接口、自动化、性能全都有)
目录 思维发散 Linux 测试概念和模型 测试计划与工具 测试用例设计 Web项目 Python基础 算法 逻辑 接口测试 性能测试 总结感谢每一个认真阅读我文章的人!!! 重点:配套学习资料和视频教学 思维发散 一个球ÿ…...

速来~与 Werner Vogels 博士一起探索敏捷性与创新速度一起提升的秘方
Amazon Web Services 的现代应用程序创新一直是 Amazon 公司坚持追求的核心目标。约20年前,我们经历了一次彻底的转型,旨在建立起“发明、发布、再发明、再发布、重新开始、洗牌、再重复”的快速迭代流程。正是此番探索,彻底改变了我们构建应…...