UML Mermaid

继承Inheritance
classA --|> classB : Inheritance
组合Composition
classA --* classB : Composition
聚合Aggregation
classA --o classB : Aggregation
关联Association
classA --> classB : Association
依赖Dependency
classA ..> classB : Dependency
实现Realization
classA ..|> classB : Realization

最近在看 《架构整洁之道》 ,书中举一些例子时会有UML类图,个人对于UML类图记得不是很清晰(上学学过之后好像只有写论文和课程作业的时候有用到,工作时,只有写技术方案会用到,基本也是边查编写),所以理解起来不是很方便,准备再总结下。刚好mermaid语法也不会,所以下文将结合mermaid整理总结下UML类图。

ps 对于组合/聚合/关联之间的差异有点不太理解,所以查了一下相关的说明,发现visual-paradigm.com有一篇文章写的比较好,但是没有中文,试着翻译了一下,有兴趣的可以看下[翻译]UML Association(关联) vs Aggregation(聚合) vs Composition(组合)

什么是类图

类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。

在类图中,一个类由三部分组成

  • 类名(可以包括特性,比如抽象类,接口类)
  • 类的属性,成员变量
  • 类的操作,方法

mermaid 写法如下

1
2
3
4
5
6
7
<pre class="mermaid"><!-- 表明语言是mermaid -->
classDiagram <!-- 表明是类图 -->
class ClassName{ <!-- ClassName 类名 -->
<<abstract>> <!-- abstract 表明是抽象类 -->
+AttributeName : int <!-- + 访问修饰符是public;AttributeName 属性名;int 属性类型 -->
+MethodName(int num) string <!-- ()表示为函数 + 访问修饰符是public;int 参数类型,string 方法返回值类型 -->
}</pre>

对应效果

    classDiagram
    class ClassName{
        +AttributeName : int
        -AttributeName : string
        #AttributeName : decimal
        +MethodName(int, double) string
    }

类属性

  • <<Interface>> 接口类
  • <<abstract>> 抽象类
  • <<Service>> 服务类
  • <<enumeration>> 枚举

访问修饰符 Visibility

  • + public
  • - private
  • # protected
  • ~ Package/Internal

多重性 Multiplicity

  • 1/1..1 表示另一个类的一个对象只与该类的一个对象有关系
  • 0..1 表示另一个类的一个对象没有或只与该类的一个对象有关系
  • 1..* 表示另一个类的一个对象与该类的一个或多个对象有关系
  • * 表示另一个类的一个对象与该类的多个对象有关系
  • n 表示另一个类的一个对象与该类的n(n>1)对象有关系
  • 0..n 表示另一个类的一个对象没有或与该类的多个对象有关系
  • 1..n 表示另一个类的一个对象或与该类的一个或n个对象有关系

需要注意的点

  • n表示大于1
  • 多重性应用于关联的目标端,说明源类的每个实例与目标类实例的关联个数

例子

classDiagram
Form "1..*" --> "0..*" Button
class Form{
    + Buttons : Button
}
class Button{
    + Text : string
}

如上图所示,一个Form(页面)可以有一个或多个Button(按钮),但是一个Button(按钮)只能属于一个Form(页面)。所以一个Form类的对象可以与零个或多个Button类的对象相关联,但一个Button类的对象只能与一个Form类的对象关联.

类的关系

总体语法

1
2
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB] : LabelText
类A "以类A为目标类的多重性修饰" 箭头 "以类B为目标类的多重性修饰" 类B : 文字

关联关系 Association

用于表示一类对象与另一类对象之间有联系,如下图,CheckResult(校验结果类)有属性Items是List<LanguageWordsItem>类型,则CheckResult与LanguageWordsItem是关联关系。 ... has a ..

以带燕尾箭头的实线表示

markdown

1
2
3
4
5
6
7
8
9
<pre class="mermaid">    classDiagram
class CheckResult{
+LanguageWordsItem[] Items
}
class LanguageWordsItem{
+string Language
+int Type
}
CheckResult --> LanguageWordsItem</pre>

classDiagram

classDiagram
class CheckResult{
    +LanguageWordsItem[] Items
}
class LanguageWordsItem{
    +string Language
    +int Type
}
CheckResult --> LanguageWordsItem

组合/组成关系 Composition

用于表示类之间整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在。比如下图中Company(公司)拥有CompanyDepartment(部门),当没有公司时,部门也就不存在了。 ... is a part of ...

以实心的菱形箭尾与实线表示

markdown

1
2
3
4
5
6
7
8
9
<pre class="mermaid">    classDiagram
class Company{
+CompanyDepartment[] Departments
}
class CompanyDepartment{
+int Id
+string Name
}
Company *-- CompanyDepartment</pre>

classDiagram

classDiagram
class Company{
    +CompanyDepartment[] Departments
}
class CompanyDepartment{
    +int Id
    +string Name
}
Company *-- CompanyDepartment

聚合关系 Aggregation

用于表示类之间整体与部分的关联关系,是“弱”的包含(” … owns a …” )关系,成分类可以不依靠聚合类而单独存在,可以具有各自的生命周期,部分可以属于多个整体对象。比如下图中,Library(图书馆)有Boook(书),但是即便图书馆没有了,书还是独立存在的。 ... owns a ...

以空心的菱形箭尾与实线来表示

markdown

1
2
3
4
5
6
7
8
9
10
<pre class="mermaid">    classDiagram
class Library{
+Book[] Books
}
class Book{
+int Id
+string Name
+string Press
}
Library o-- Book</pre>

classDiagram

classDiagram
class Library{
    +Book[] Books
}
class Book{
    +int Id
    +string Name
    +string Press
}
Library o-- Book

依赖关系 Dependency

表示一类依赖于另外的类,因为类在某个时间点使用另一个类。 ... uses a ...

以带燕尾箭头的虚线表示

常见的三种依赖关系实现方式

  1. 一个类的对象作为另一个类中方法的参数
  2. 一个类的方法中将另一个类的对象作为其局部变量
  3. 一个类的方法中调用另一个类的静态方法

如下的例子就是方式一的实现,ArticlesController(文章类)的GetList(获取列表)方法使用了ArticleSearchModel(查询类)作为参数。

markdown

1
2
3
4
5
6
7
8
9
10
11
<pre class="mermaid">    classDiagram
class ArticlesController{
+GetList(ArticleSearchModel model,int x) ArticleListModel
}
class ArticleSearchModel{
+int Page
+int Rows
+int Type
+string Key
}
ArticlesController ..> ArticleSearchModel</pre>

classDiagram

classDiagram
class ArticlesController{
    +GetList(ArticleSearchModel model,int x) ArticleListModel
}
class ArticleSearchModel{
    +int Page
    +int Rows
    +int Type
    +string Key
}
ArticlesController ..> ArticleSearchModel

实现关系 Realization

表示一个class类实现interface接口(可以是多个)。如下图所示ArticleService实现了接口IArticleService。

以空心三角形箭头的虚线表示

markdown

1
2
3
4
5
6
7
8
<pre class="mermaid">    classDiagram
class IArticleService{
+GetList(ArticleSearchModel model) ArticleListModel
}
class ArticleService{
+GetList(ArticleSearchModel model) ArticleListModel
}
IArticleService <|.. ArticleService</pre>

classDiagram

classDiagram
class IArticleService{
    +GetList(ArticleSearchModel model) ArticleListModel
}
class ArticleService{
    +GetList(ArticleSearchModel model) ArticleListModel
}

IArticleService <|.. ArticleService

继承/泛化 Inheritance/Generalization

表示父类与子类之间的关系。

以带空心三角形箭头的实线表示

markdown

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<pre class="mermaid">    classDiagram
class CheckKeywordsHandler{
+Check() CheckResult
+BuildNeedCheckWords(string str)
}
class WordsHandler{
+BuildNeedCheckWords(string str)
}
class SwaggerHandler{
+BuildNeedCheckWords(string str)
}
class OpenAPIHandler{
+BuildNeedCheckWords(string str)
}
class JsonHandler{
+BuildNeedCheckWords(string str)
-BuildJsonAllKey(JsonElement jsonElement, string[] keys)
}
CheckKeywordsHandler <|-- WordsHandler
CheckKeywordsHandler <|-- SwaggerHandler
CheckKeywordsHandler <|-- OpenAPIHandler
CheckKeywordsHandler <|-- JsonHandler</pre>

classDiagram

classDiagram
class CheckKeywordsHandler{
    +Check() CheckResult
    +BuildNeedCheckWords(string str)
}
class WordsHandler{
    +BuildNeedCheckWords(string str)
}
class SwaggerHandler{
    +BuildNeedCheckWords(string str)
}
class OpenAPIHandler{
    +BuildNeedCheckWords(string str)
}
class JsonHandler{
    +BuildNeedCheckWords(string str)
    -BuildJsonAllKey(JsonElement jsonElement, string[] keys)
}
CheckKeywordsHandler <|-- WordsHandler
CheckKeywordsHandler <|-- SwaggerHandler
CheckKeywordsHandler <|-- OpenAPIHandler
CheckKeywordsHandler <|-- JsonHandler

REF

评论