MarkDown中写UML图的方法

news2024/9/30 19:30:59

目录

  • 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来声明即可。

sequenceDiagram
    actor 学生
    actor 老师
    学生->>老师: 老师好!
    老师-->>学生: 你好~
学生 老师 老师好! 你好~ 学生 老师

为对象设置别名

如果觉得对象名太长太复杂,那么可以使用participant···as···的语法为对象名设置一个简要的别名。

sequenceDiagram
    participant A as 学生
    participant B as 老师
    A->>B: 老师好!
    B-->>A: 你好~
学生 老师 老师好! 你好~ 学生 老师

这样画出来的图没有区别,但是写法上会简单很多。

激活对象

如果想要激活对象,那么使用activate;取消对象的激活状态,则使用deactivate

sequenceDiagram
    actor A as 学生
    actor B as 系统
    A->>B: 录入信息
    activate B
    B-->>A: 更新信息
    deactivate B
学生 系统 录入信息 更新信息 学生 系统

可以使用+/-简化激活/未激活状态。

sequenceDiagram
    actor 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 天鹅{
        +黑色与白色
        +捕鱼()
        +下蛋()
    }
1
2
1
n
1
1
动物
+ 生命
+ 性别
+新陈代谢(int 氧气,int 水)
+繁衍后代()
氧气
+羽毛
+进食()
+下蛋()
老鹰
-鹰眼视力
-抓田鼠()
-下蛋()
白鹭
+野生自然
+捕鱼()
+下蛋()
天鹅
+黑色与白色
+捕鱼()
+下蛋()
翅膀
天鹅群
飞翔
+飞()
气候

类定义的两种方式

  1. 使用关键词class来定义一个类。
    class Animal可以定义一个Animal的类:
classDiagram
    class Animal
Animal
  1. 通过两个类之间的关系可以同时定义两个类。
    Vehicle <|-- Car表示Car类继承自Vehicle类:
classDiagram
    Vehicle <|-- Car
Vehicle
Car

需要注意的是,类名应该只由字母、数字、字符(包括Unicode)和下划线组成。

为类定义成员

类通常有其特有的属性和方法,方法用到的参数通常在后面用()括起来。

而属性与方法的访问级别修饰符表示通常在冒号后面用一个符号来表示,对应的关系如下表所示:

符号访问级别修饰符
+Public
-Private
#Protected
~Package/Internal

如果想表示抽象方法或者是静态方法或静态变量,可以分别使用*$符号标明:

  • 抽象方法:someAbstractMethod()*
  • 静态方法:someStaticMethod()$
  • 静态变量:String someField$

同样的,有两种方法来定义类的成员:

  1. 在类后面使用:,冒号后面跟类成员。这种方式适用于一次定义一个成员。
classDiagram
class Person
Person: +String name
Person: +int age
Person: +work(time) bool
Person: +study(time) int
Person
+String name
+int age
+work(time) : bool
+study(time) : int
  1. 使用{}将类成员括起来。这种方式适用于一次定义多个成员。
classDiagram
class Person{
    +String name
    +int age
    +work(time) bool
    +study(time) int
}
Person
+String name
+int age
+work(time) : bool
+study(time) : int

注:如果方法有返回值,那么返回值类型可以在方法后加一个空格并加上其返回值类型。

如果成员变量中含有泛型,那么像List<int>是这样表示的:List~int~。即使用了~ ~来表示了< >

classDiagram
class Square~Shape~{
    int id
    List~int~ position
    setPoints(List~int~ points)
    getPoints() List~int~
}

Square : +List~string~ messages
Square : +setMessages(List~string~ messages)
Square : +getMessages() List~string~
Square : +getDistanceMatrix() List~List~int~~
Square<Shape>
int id
List<int> position
+List<string> messages
setPoints(List<int> points)
getPoints() : List<int>
+setMessages(List<string> messages)
+getMessages() : List<string>
+getDistanceMatrix()

双向关系的表示

关系可以表示逻辑上N:M的联系。
一个简单的例子如下:

classDiagram
    Animal <|--|> Zebra
Animal
Zebra

双向关系的语法格式:

[关系类型][连接][关系类型]

其中关系类型如下表所示:

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

其中连接如下表所示:

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

多重性关系的表示

类图中的多重性或者叫基数表示一个类有多少实例可以与另一个类的实例形成关系。

不同的基数表示方法:

  • 1:一个
  • 0..1:零个或一个
  • 1..*:一个或多个
  • *:零个或多个
  • n:n个
  • 0..n:零到n个
  • 1..n:一到n个

基数可以在箭头表示的关系左右加上引号和以上的基数表示:

classDiagram
    Customer "1" --> "*" Ticket
    Student "1" --> "1..*" Course
    Galaxy --> "many" Star : Contains
1
*
1
1..*
n
Customer
Ticket
Student
Course
Galaxy
Star

UML之状态图

状态图主要用于描述一个特定的对象的所有可能状态以及由于各种事件的发生而引起的状态之间的转换。

状态图的构成要素

  • 状态(States):在对象的生命周期中满足某些条件、执行某些活动或等待某些事件的一个条件或状况。所有的对象都有状态,状态是对象执行了一系列活动的结果,当某个事件发生后,对象的状态将发生变化。
    状态图中可以包含0个多个开始状态,也可以包含多个结束状态。模型不必同时具有开始和结束状态,因为模型可以总是运行,从不停止。
  • 转移(Transitions):两个状态之间的一种关系,表示对象将在第一个状态中执行一定的动作并在某个特定事件发生或某个特定条件满足时进入第二个状态。
StateA
StateB
  • 事件:使状态发生变化的某时刻发生的动作或活动,用来指示是什么触发了转移从而导致状态发生了改变。事件通常在从一个状态到另一个状态的转移路径上直接指定。
  • 判断:判断点通过对事件判断分组转移到各自方向,提高了状态图的可视性。
StateA
StateB
StateC
StateD
  • 同步:使用同步和活动图一样是为了说明并发工作流的分叉与联合。
StateA
StateB

注:状态图重点在与描述对象的状态及其状态之间的转移,与活动图区别在于状态图注重的是行为的结果,活动图更注重是行为的动作。

Mermaid中顺序图的简单例子

样例

在下面这段文字(代码块中)的前面和后面一行各自添加```(键盘左上,与~共用一个键)即可生成如下图的展示结果(注意在使用时需要增加mermaid标识,加在前面那三点的后面)。

stateDiagram
    [*] --> 用户登录
    用户登录 --> 登录成功:验证通过
	登录成功 --> 填写信息:注册新卡
    填写信息 --> 存入数据库:信息合理
    存入数据库--> 提示成功:保存成功
    提示成功 --> 退出系统:退出
    退出系统-->[*]
验证通过
注册新卡
信息合理
保存成功
退出
用户登录
登录成功
填写信息
存入数据库
提示成功
退出系统

状态的表示

状态的表示有多种方式:

  1. 最简单的是用一个名字来定义一个状态:
stateDiagram-v2
    stateId
stateId
  1. 如果要简写状态名,则可以使用以下方式:
stateDiagram-v2
    state "StateA" as s1
    s1 -->StateB
StateA
StateB

这样在后续就可以直接使用s1来表示StateA了。
3. 简写状态名还可以用冒号的方式:

stateDiagram-v2
    s1 : StateA
    s1 -->StateB
StateA
StateB

转移的表示

转移使用箭头-->表示。
当在两个状态间定义一个转移时,这两个状态也同时会被定义。

stateDiagram-v2
    s1 --> s2
s1
s2

如果想在转移上添加文字,那么在后面加上一个冒号后写上想添加的文字即可。

stateDiagram-v2
    s1 --> s2: A transition
A transition
s1
s2

开始和结束的表示

在状态图中,开始和结束状态是两个特殊的状态。它们都用[*]来表示。

stateDiagram-v2
    [*] --> s1
    s1 --> [*]
s1

判断的表示

如果状态图中涉及到了判断,那么可以使用<<choice>>来表示。

stateDiagram-v2
    state if_state <<choice>>
    [*] --> IsPositive
    IsPositive --> if_state
    if_state --> False: if n < 0
    if_state --> True : if n >= 0
if n < 0
if n >= 0
IsPositive
False
True

同步的表示

对于同步的表示,则使用到了<<fork>><<join>>

stateDiagram-v2
    state fork_state <<fork>>
      [*] --> fork_state
      fork_state --> State2
      fork_state --> State3

      state join_state <<join>>
      State2 --> join_state
      State3 --> join_state
      join_state --> State4
      State4 --> [*]
State2
State3
State4

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

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

相关文章

毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计

基于51单片机的手机蓝牙控制8位LED灯亮灭设计1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STC89C52单片机核心系统电路设计2.2 LED电路设计2.3 蓝牙模块电路设计3、部分代码展示3.1 定时器初始化以及中断处理3.2 串口初始化3.3 串口中断处理1、项目简介 选题指导&…

微信授权登录流程以及公众号配置方法(golang后端)

一、准备一个已经认证OK的微信公众号和已经备案的域名&#xff0c;且解析好配置好https证书。 1.如上图 微信公众号 > 基本配置 &#xff0c;设置开发者密码 2.设置IP白名单&#xff0c;白名单填写提供后端服务的服务器公网IP 二、公众号服务器配置。 1.找到基本配置 2.将服…

C语言基础应用(二)数据的转换与输入输出

学习了C语言的基本数据类型后&#xff0c;我们可能会想这些数据如何进行运算&#xff0c;是否可以让不同类型的数据直接进行运算呢&#xff1f; 一、数据类型转换 1.1 int类型与float类型之间的转换 int i 5; // j值为2.000000 因为左右操作数均为整型float j i/2; // …

人脸识别原理与模型方法综述

概述 一、人脸识别流程 二、优点特性 1、便捷性 采集设备简单&#xff0c;使用快捷。一般来说&#xff0c;常见的摄像头就可以用来进行人脸图像的采集&#xff0c; 不需特别复杂的专用设备。图像采集在数秒内即可完成。 2、友好性 通过人脸识别身份的方法与人类的习惯一致&am…

C# 用NPOI读取EXCEL

1. 复制DLL文件 ICSharpCode.SharpZipLib.dll NPOI.dll NPOI.OOXML.dll NPOI.OpenXml4Net.dll NPOI.OpenXmlFormats.dll 2. 在工程中添加引用 3. using System.IO; using NPOI.HSSF.UserModel; using NPOI.XSSF.UserModel; using NPOI.SS.UserModel; using NPOI.OpenXml4Ne…

顿悟日记(一)

目录2023年1月顿悟日记&#xff1a;2023年2月24日顿悟日记&#xff1a;2023年2月25日顿悟日记&#xff1a;2023年2月26日顿悟日记&#xff1a;顿悟的经历是如此的奇妙&#xff0c;且让人亢奋的事情。 2023年1月顿悟日记&#xff1a; 1.我是面向对象还是面向过程&#xff1f; …

Linux下使用Shell脚本实现进程监控

本文介绍一种在Linux系统下为实现某些关键进程状态的实时监控而使用shell脚本的编写方法。在这里主要通过监控某些进程是否退出作为判断依据&#xff0c;如果某个进程退出了&#xff0c;则进行对应的恢复处理&#xff0c;如重新拉起相关的进程等。下面介绍该脚本的实现流程。首…

MyBatis之增、删、查、改

目录 前言 一、配置MyBatis开发环境 1.1 创建数据库和表 1.2 添加框架支持 1.3 创建目录结构 1.4 配置数据库连接 1.5 配置MyBatis中的XML文件路径 二、添加业务代码 2.1 查询数据库操作 2.1.1 添加实体类 2.1.2 添加mapper接口 2.1.3 在xml中实现mapper接口 2.1.…

【数据挖掘实战】——中医证型的关联规则挖掘(Apriori算法)

目录 一、背景和挖掘目标 1、问题背景 2、传统方法的缺陷 3、原始数据情况 4、挖掘目标 二、分析方法和过程 1、初步分析 2、总体过程 第1步&#xff1a;数据获取 第2步&#xff1a;数据预处理 第3步&#xff1a;构建模型 三、思考和总结 项目地址&#xff1a;Data…

jQuery:入门

jQuery 入门 Date: January 19, 2023 目标&#xff1a; 能够说出什么是 jQuery 能够说出 jQuery 的优点 能够简单使用 jQuery 能够说出 DOM 对象和 jQuery 对象的区别 jQuery 概述 JavaScript 库 仓库&#xff1a; 可以把很多东西放到这个仓库里面。找东西只需要到仓库里…

vue中子组件间接修改父组件传递过来的值

一、前言 Vue官方文档Props单向数据流讲解 Vue中遵循单向数据流&#xff0c;所有的 props 都遵循着单向绑定原则&#xff0c;props 因父组件的更新而变化&#xff0c;自然地将新的状态向下流往子组件&#xff0c;而不会逆向传递。这避免了子组件意外修改父组件的状态的情况&a…

分布式算法 - ZAB算法

ZAB 协议全称&#xff1a;Zookeeper Atomic Broadcast&#xff08;Zookeeper 原子广播协议&#xff09;, 它应该是所有一致性协议中生产环境中应用最多的了。为什么呢&#xff1f;因为它是为 Zookeeper 设计的分布式一致性协议&#xff01;什么是 ZAB 协议&#xff1f; ZAB 协议…

Java基本数据类型

1.概述 佛说&#xff0c;大千世界&#xff0c;无奇不有。在这个世界里&#xff0c;物种的多样性&#xff0c;遍地开花&#xff0c;同样&#xff0c;在Java的世界里&#xff0c;也有着异曲同工之妙&#xff0c;Java秉承面向对象的特性&#xff0c;必然少不了区分对象的类型&…

【安全知识】——端口复用隐藏后门

作者名&#xff1a;白昼安全主页面链接&#xff1a; 主页传送门创作初心&#xff1a; 以后赚大钱座右铭&#xff1a; 不要让时代的悲哀成为你的悲哀专研方向&#xff1a; web安全&#xff0c;后渗透技术每日鸡汤&#xff1a; 精彩的人生是在有限的生命中实现无限价值端口复用是…

【C++】类和对象的六个默认成员函数

类的6个默认成员函数构造函数概念特性析构函数概念特性拷贝构造函数概念特征拷贝构造函数典型调用场景&#xff1a;赋值运算符重载运算符重载赋值运算符重载取地址及const取地址操作符重载类的6个默认成员函数 到底什么是类的6个默认成员函数呢&#xff1f;相信大家一定对此怀…

2023安装archlinux笔记

本文只是个笔记&#xff0c;不是详细教程&#xff0c;仅供参考。 安装过程基本与 《2021年vmware安装archlinux》 https://blog.csdn.net/lxyoucan/article/details/115226297 差不多。 无U盘安装 不想格式化U盘了&#xff0c;直接从硬盘安装。参考一下文章。 《没有U盘纯硬…

什么是全站加速(DCDN)

全站加速&#xff08;DCDN&#xff09; 在阅读本文之前&#xff0c;如果你还没有看过 你管这玩意儿叫CDN 这篇文章&#xff0c;可以先去看一下&#xff0c;然后再来阅读本文&#xff0c;效果会更好一些。 什么是全站加速 全站加速DCDN&#xff08;Dynamic Route for Content…

每日分享(苹果CMS V10仿韩剧TV主题模板源码)

demo软件园每日更新资源,请看到最后就能获取你想要的: ​ 1.低代码引擎技术白皮书 PDF高清版 低代码引擎是一款为低代码平台开发者提供的&#xff0c;具备强大定制扩展能力的低代码设计器研发框架。本白皮书从应用、基础协议和原理三个方面对低代码引擎的技术进行了全面的介绍…

计算机网络体系结构及分层参考模型

文章目录一、分层设计思想的提出二、网络分层的必要性三、什么是计算机网络体系结构四、计算机网络参考模型OSI参考模型/五层参考模型/TCP/IP参考模型一、分层设计思想的提出 最早提出分层思想的是 ARPANET网。1969年11月&#xff0c;美国国防部开始建立一个命名为ARPANET的网络…

c++编程入门到精通(四) 编译过程详解(g++ 编译选项 & cmake编译初解 vscode调试c++)

目录1. g编译基础1.1 g编译过程简述1.2 安装2.g编译过程2.1 g编译选项2.2 g编译实例2.2.1直接编译2.2.2 生成库文件并编译2.2.3 运行可执行文件3. cmake初步3.1 基本特点3.2 CMake基础3.2.1 CMake常见指令3.2.2 CMake常用变量4. CMake编译工程4.1两种方式设置编译规则&#xff…