类图
类图
Mermaid 中创建类图的语法
Define a class
定义类的方式:
- 显式声明类:
实现:
class Animal效果:
- 在关系中隐式声明一个类
classDiagram
Vehicle <|-- Car定义两个类Vehicle、Car,且Car 继承于Vehicle
效果:
Class labels
在类名中添加标签-额外的说明
语法:
class Name["label"]实现:
classDiagram
class Class["This is a label"]效果:
Annotations on classes
It is possible to annotate classes with markers to provide additional metadata about the class.
| type(annotatiion) | description |
|---|---|
| <<Interface>> | |
| <<Abstract>> | |
| <<Service>> | |
| <<Enumeration>> | |
| 声明的方式:class Name | |
| 效果: |
Defining Members of class
UML provides mechanisms to represent class members such as attributes and methods, as well as additional information about them.
通过()区分属性 和 方法
classDiagram
class Class {
function()
property
}效果:
问:所以在功能上有什么区别吗?
定义的方式:
实现:
classDiagram
class Class {
member
}效果:
实现:
classDiagram
class Class
Class: member效果:
Visibility
在属性、方法定义前添加visibility 说明
实现:
classDiagram
class Class {
+ Public
- Private
# Protected
}效果:
定义方法
实现:
classDiagram
class Class {
member(argument) int
}
Class : add() bool示例中方法的参数只有名称
效果:
泛型参数<>
使用~ 替代<>, 直接使用<> 不显示
实现:
classDiagram
class Class {
List~int~ position
}效果:
Defining Relationship
[classA][Arrow][ClassB]: label| Type | Description | 中文名 | 含义 |
|---|---|---|---|
| <|-- | Inheritance/Generalization | 继承/泛化 | 一个银行账户下可以分为多种类型的账户,如:储蓄、信用。。。它们都属于银行账户。满足is-one (其中一类)的关系就是继承(泛化) 箭头朝向左的含义:通常将基类写在左侧 |
*-- | Composition | 组合 | “一只青蛙一张嘴,两只眼睛,四条腿” 青蛙的身体构成包含:嘴巴、眼睛和腿。青蛙不存在时,其身体构造不能单独存在。满足 ”整体与局部的关系,但整体与局部不可分割,具有一致的生命周期。整体不存在时构成对象也不存在“ |
o-- | Aggregation | 聚合 | 和组合相同的地方:类之间也是整体 与 部分的关系。差别在于构成对象可以脱离整体单独存在。公司倒闭后员工可以转到其他公司。 |
--> | Association | 关联 | C1驾照司机可以开小、微载客汽车,轻微载货汽车。一辆车运行需要司机 "一个类的属性持有对另一个类的引用。组合和聚合也属于关联" 典型:报社和订阅者之间 |
-- | Link (Solid) | ||
..> | Dependency | 依赖 | 个人的成长依赖于环境。汽车行驶的距离依赖于油(电)量。”类A的变换导致类B的变化,B类依赖于A类“ ”依赖关系是一种使用关系”。如参数的传入或传出 |
| ..|> | Realization | 实现 | 当基类是抽象类时,子类是基类的具体实现。 |
.. | Link (Dashed) |
我的理解:
- 组合相当于捆绑多个对象构成一个对象。整体不存在,组成部分也就不存在。组成部分不能脱离整体。组成部分可以更换,但是必须存在。
- 聚合相比组合,连接关系稍弱。组成部分可以脱离整体独立存在。
代码实现:
class BankAccount;
class SavingAccount : public BankAccount {};
class Human {
class Head;
class Body;
Head head;
Body body;
};作为成员
实现:
classDiagram
CurrentAccount --|> BankAccount : Inheritance-继承(Generalization-泛化)
SavingAccount --|> BankAccount : Inheritance
CreditAccount --|> BankAccount : Inheritance
Contact --* ContactBook : Composition-组合
Employee --o Company : Aggregation-聚合
Teacher --> Course : (Directed)Association-关联
Person ..> Book : Dependency-依赖
class Corporation
class P
class Owner {
<<interface>>
+acquire(property)
+dispose(property)
}
P ..|> Owner : Realization-实现
Corporation ..|> Owner : Realization
Driver -- Car : Association/Link(Solid)
classO .. classP : Link(Dashed)效果:
Cardinality / Multiplicity on relations
[!quote]
indicates the number of instance of one class that can be linked to an instance of the other class.
描述类的实例对象之间数量关系
描述数量的cardinality 值:
| Cardinality | 范围 | description |
|---|---|---|
| 1 | 1 | 只有1个 |
| 0..1 | Zero or One | 最后有1个 |
| 1..* | >=1 | 至少有1个 |
| * | 0到无穷,不确定数量 | |
| n | n > 1 | n是具体数字,有n个 |
| 0..n | [0,n] | 0到n个 |
| 1..n | [1,n] | 1到n个 |
| many | 字符描述 |
使用:
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText- 使用” ” 包围cardinality
- LabelText:描述关系
示例:
classDiagram
Subject "1" --> "many" Observer: containNotes
注释:
- 关联到类
- 整体说明
classDiagram
note "This is a general note"
class MyClass {
}
note for MyClass "This is a note for a class"问:没办法指定Note的位置吗???
在sequence 中可以通过 Note right of A: Note 来设置note的位置
Configuration
Member Box
显示一个类时即使没有定义member 也会显示对应的box,可以通过配置修改是否显示空白(没定义member)的box
配置:diagram 的属性 hideEmptyMembersBox
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
class Duck效果:
Setting the direction of the diagram
classDiagram
direction RL
Children --|> Base效果:
默认被指向的类在上方
问:为什么默认情况下不是从上到下(先出现的在上),然后可以通过direction设置方向?