markdown类图学习
在软件工程中,统一建模语言(UML)中的类图是一种静态结构图,它通过显示系统的类、它们的属性、操作(或方法)以及对象之间的关系来描述系统的结构。
类图是面向对象建模的主要构建块。它用于应用程序结构的一般概念建模,以及将模型转换为编程代码的详细建模。类图还可以用于数据建模。类图中的类既表示主要元素、应用程序中的交互,也表示要编程的类。
类图例子
示例源码:
classDiagramAnimal <|-- DuckAnimal <|-- FishAnimal <|-- ZebraAnimal : +int ageAnimal : +String genderAnimal: +isMammal()Animal: +mate()class Duck{+String beakColor+swim()+quack()}class Fish{-int sizeInFeet-canEat()}class Zebra{+bool is_wild+run()}
效果如下:(类图的源码要用"```mermaid ```"包裹)
语句规则
Class
UML提供了表示类成员的机制,例如属性和方法,以及关于它们的附加信息。图中类的单个实例包含三个部分:
- 顶部的隔间包含类的名称。它以粗体和居中打印,并且第一个字母是大写的。它还可以包含描述类性质的可选注释文本。
- 中间的隔间包含类的属性。它们是左对齐的,第一个字母是小写的。
- 底部的分隔符包含类可以执行的操作。它们也是左对齐的,第一个字母是小写的。
classDiagramclass BankAccountBankAccount : +String ownerBankAccount : +Bigdecimal balanceBankAccount : +deposit(amount)BankAccount : +withdrawl(amount)
效果如下:
Define a class 定义类
定义类有两种方法:
- 使用像class Animal这样的关键字class显式定义一个类。这定义了Animal类
- 通过它们之间的关系定义两个类Vehicle <|—Car。这定义了两个类Vehicle和Car及其关系
classDiagramclass AnimalVehicle <|-- Car
效果如下:
命名约定:类名应该由字母数字(unicode允许)和下划线字符组成。
Defining Members of a class 定义属性与方法
UML提供了表示类成员的机制,例如属性和方法,以及关于它们的附加信息。
Mermaid根据是否存在圆括号()来区分属性和函数/方法。带有()的函数被视为函数/方法,其他的则被视为属性。
定义类成员有两种方法,无论使用哪一种语法来定义成员,输出都是相同的。两种不同的方式是:
- 使用:(冒号)后跟成员名关联类的成员,一次定义一个成员很有用。例如:
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
效果如下:
- 使用{}方括号关联类的成员,其中成员在花括号中分组。适合一次定义多个成员。例如:
classDiagram
class BankAccount{+String owner+BigDecimal balance+deposit(amount)+withdrawl(amount)
}
效果如下:
Return Type 定义方法返回值类型
可以在方法定义之后添加:一个空格 + 返回值类型,作为方法的返回类型
classDiagram
class BankAccount{+String owner+BigDecimal balance+deposit(amount) bool+withdrawl(amount) int
}
效果如下:
Generic Types 泛型
成员可以使用泛型类型定义,例如List,通过将类型括在~(波浪号)中来定义字段、参数和返回类型。注意:目前不支持嵌套类型声明(如List)
这可以作为类定义方法的一部分来完成:
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~
效果如下:
Visibility 可见性
要指定类成员(即任何属性或方法)的可见性,这些标记可以放在成员名之前,但它是可选的:
+ Public- Private# Protected~ Package/Internal
注意,你也可以通过在方法的末尾添加以下符号来在方法定义中添加额外的分类器,比如方法被static修饰,是抽象方法等。例如:
* Abstract e.g.: someAbstractMethod()*$ Static e.g.: someStaticMethod()$
注意,你还可以通过在字段名的末尾添加以下符号来包括额外的分类器到字段定义中:
$ Static e.g.: String someField$
Defining Relationship 定义关系
关系是一个通用术语,涵盖了在类和对象图中发现的特定类型的逻辑连接。
语法:[classA][Arrow][ClassB]
目前支持的UML下定义的类有不同类型的关系:
| Type | Description |
|---|---|
| <|- - | Inheritance 继承 |
| *- - | Composition 构成 |
| o- - | Aggregation 聚合 |
| - -> | Association 关联 |
| - - | Link (Solid) |
| ..> | Dependency |
| ..|> | Realization 实现 |
| .. | Link (Dashed) |
classDiagram
classA <|-- classB
classC *-- classD
classE o-- classF
classG <-- classH
classI -- classJ
classK <.. classL
classM <|.. classN
classO .. classP
效果如下:
我们可以用这些标签来描述两个类之间关系的性质。另外,箭头也可以用于相反的方向:
classDiagram
classA --|> classB : Inheritance
classC --* classD : Composition
classE --o classF : Aggregation
classG --> classH : Association
classI -- classJ : Link(Solid)
classK ..> classL : Dependency
classM ..|> classN : Realization
classO .. classP : Link(Dashed)
效果如下:
Labels on Relations 关系上的标签
可以向关系中添加标签文本:
语法:[classA][Arrow][ClassB]:LabelText
classDiagram
classA <|-- classB : implements
classC *-- classD : composition
classE o-- classF : aggregation
效果如下:
Two-way relations 双向关系
关系可以有多种方式:
classDiagramAnimal <|--|> Zebra
语法:[Relation Type][Link][Relation Type]
其中Relation Type可以是:
Type Description
<| Inheritance
* Composition
o Aggregation
> Association
< Association
|> Realization
Link可以是:
Type Description
-- Solid
.. Dashed
Annotations on classes 注释在类
可以用类似于类元数据的特定标记文本对类进行注释,从而对类的性质给出明确的指示。一些常见的注释示例可能是:
<表示接口类> <表示一个抽象类> <表示服务类> <表示枚举>
注释在开头<<和结尾>>中定义。有两种向类添加注释的方法,无论使用的语法是什么,输出都是相同的。两种方法是:
- 在定义类之后的单独一行中。例如:
classDiagram
class Shape
<<interface>> Shape
Shape : noOfVertices
Shape : draw()
效果如下:
- 在嵌套结构中,与类定义一起。例如:
classDiagram
class Shape{<<interface>>noOfVerticesdraw()
}
class Color{<<enumeration>>REDBLUEGREENWHITEBLACK
}
效果如下:
Comments 注释
注释可以在类图中输入,解析器会忽略注释。注释需要单独一行,并且必须以%%(双百分比符号)开头。从注释开始到下一个换行符之后的任何文本都将被视为注释,包括任何类图语法
classDiagram
%% This whole line is a comment classDiagram class Shape <<interface>>
class Shape{<<interface>>noOfVerticesdraw()
}
效果如下:
Cardinality / Multiplicity on relations 关系上的基数性/多样性
类图中的多重性或基数性表示一个类的实例数量链接到另一个类的一个实例。例如,一个公司将有一个或多个员工,但每个员工只为一个公司工作。
多重符号被放置在一个关联的末端附近。
不同的基数选项有:
1 Only 10..1 Zero or One1..* One or more* Manyn n {where n>1}0..n zero to n {where n>1}1..n one to n {where n>1}
在给定箭头的前面(可选)和后面(可选)引号中放置基数文本,可以很容易地定义基数。
语法:[classA] “cardinality1” [Arrow] “cardinality2” [ClassB]:LabelText
classDiagramCustomer "1" --> "*" TicketStudent "1" --> "1..*" CourseGalaxy --> "many" Star : Contains
效果如下:
Setting the direction of the diagram 设置图表的方向
对于类图,您可以使用direction语句来设置图呈现的方向,就像本例中一样。
classDiagramdirection RLclass Student {-idCard : IdCard}class IdCard{-id : int-name : string}class Bike{-id : int-name : string}Student "1" --o "1" IdCard : carriesStudent "1" --o "1" Bike : rides
效果如下:
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
