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 |
|
对应效果
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 |
|
关联关系 Association
用于表示一类对象与另一类对象之间有联系,如下图,CheckResult(校验结果类)有属性Items是List<LanguageWordsItem>类型,则CheckResult与LanguageWordsItem是关联关系。 ... has a ..
以带燕尾箭头的实线表示
markdown
1 |
|
classDiagram
classDiagram class CheckResult{ +LanguageWordsItem[] Items } class LanguageWordsItem{ +string Language +int Type } CheckResult --> LanguageWordsItem
组合/组成关系 Composition
用于表示类之间整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在。比如下图中Company(公司)拥有CompanyDepartment(部门),当没有公司时,部门也就不存在了。 ... is a part of ...
以实心的菱形箭尾与实线表示
markdown
1 |
|
classDiagram
classDiagram class Company{ +CompanyDepartment[] Departments } class CompanyDepartment{ +int Id +string Name } Company *-- CompanyDepartment
聚合关系 Aggregation
用于表示类之间整体与部分的关联关系,是“弱”的包含(” … owns a …” )关系,成分类可以不依靠聚合类而单独存在,可以具有各自的生命周期,部分可以属于多个整体对象。比如下图中,Library(图书馆)有Boook(书),但是即便图书馆没有了,书还是独立存在的。 ... owns a ...
以空心的菱形箭尾与实线来表示
markdown
1 |
|
classDiagram
classDiagram class Library{ +Book[] Books } class Book{ +int Id +string Name +string Press } Library o-- Book
依赖关系 Dependency
表示一类依赖于另外的类,因为类在某个时间点使用另一个类。 ... uses a ...
以带燕尾箭头的虚线表示
常见的三种依赖关系实现方式
- 一个类的对象作为另一个类中方法的参数
- 一个类的方法中将另一个类的对象作为其局部变量
- 一个类的方法中调用另一个类的静态方法
如下的例子就是方式一的实现,ArticlesController(文章类)的GetList(获取列表)方法使用了ArticleSearchModel(查询类)作为参数。
markdown
1 |
|
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 |
|
classDiagram
classDiagram class IArticleService{ +GetList(ArticleSearchModel model) ArticleListModel } class ArticleService{ +GetList(ArticleSearchModel model) ArticleListModel } IArticleService <|.. ArticleService
继承/泛化 Inheritance/Generalization
表示父类与子类之间的关系。
以带空心三角形箭头的实线表示
markdown
1 |
|
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