类图
在软件工程中,统一建模语言(UML)中的类图是一种静态结构图,通过显示系统的类、它们的属性、操作(或方法)以及对象之间的关系来描述系统的结构。- 维基百科
类图是面向对象建模的主要构建块。它用于应用程序结构的一般概念建模,以及详细建模以将模型转化为编程代码。类图还可以用于数据建模。类图中的类表示应用程序中的主要元素、交互以及要编程的类。
JHL 在线编辑 可以渲染类图。
---
title: Animal example
---
classDiagram
note "From Duck till Zebra"
Animal <|-- Duck
note for Duck "can fly\ncan swim\ncan dive\ncan help in debugging"
Animal <|-- Fish
Animal <|-- Zebra
Animal : +int age
Animal : +String gender
Animal: +isMammal()
Animal: +mate()
class Duck{
+String beakColor
+swim()
+quack()
}
class Fish{
-int sizeInFeet
-canEat()
}
class Zebra{
+bool is_wild
+run()
}
语法
类
UML 提供了表示类成员(如属性和方法)以及有关它们的其他信息的机制。图表中的一个类的单个实例包含三个部分:
- 顶部部分包含类的名称。它以粗体和居中方式打印,首字母大写。它还可以包含描述类性质的可选注释文本。
- 中间部分包含类的属性。它们左对齐,第一个字母小写。
- 底部部分包含类可以执行的操作。它们也是左对齐的,第一个字母小写。
---
title: Bank example
---
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +Bigdecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
定义一个类
有两种定义类的方法:
- 使用关键字 class,例如 class Animal,它将定义 Animal 类。
- 通过关系定义,同时定义了两个类以及它们之间的关系。例如,Vehicle <|-- Car。
classDiagram
class Animal
Vehicle <|-- Car
命名约定:类名只能由字母数字字符(包括 Unicode)、下划线和破折号(-)组成。
类标签
如果您需要为类提供标签,您可以使用以下语法:
classDiagram
class Animal["Animal with a label"]
class Car["Car with *! symbols"]
Animal --> Car
您还可以使用反引号来转义标签中的特殊字符:
classDiagram
class `Animal Class!`
class `Car Class`
`Animal Class!` --> `Car Class`
定义类的成员
UML 提供了表示类成员(如属性和方法)以及有关它们的其他信息的机制。
JHL 在线编辑根据成员的括号()是否存在来区分属性和函数/方法。括号()表示函数/方法,其他情况表示属性。
有两种定义类成员的方法,不管使用哪种语法来定义成员,输出结果都是相同的。这两种不同的方式是:
使用冒号(:)后跟成员名称的方式,适用于逐个定义成员。例如:
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
通过使用{}括号将成员关联到一个类中,其中成员在大括号内分组。适用于一次定义多个成员。例如:
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount)
+withdrawal(amount)
}
泛型类型
可以使用泛型类型来定义成员,例如List<int>,用于字段、参数和返回类型,通过将类型包含在~(波浪线)中。支持嵌套类型声明,例如List<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~~
可见性
为了描述类的成员(即类成员)的属性或方法/函数的可见性(或封装性),可以在成员名称之前放置可选的标记:
- + 公共(Public)
- - 私有(Private)
- # 受保护(Protected)
- ~ 包(Package/Internal)
请注意,您还可以在方法定义的末尾添加以下注释来包含附加的分类符号,即在()之后或返回类型之后:
- * 抽象(Abstract),例如:someAbstractMethod()* 或 someAbstractMethod() int*
- $ 静态(Static),例如:someStaticMethod()$ 或 someStaticMethod() String$
还请注意,您还可以在字段定义的末尾添加以下注释来包含附加的分类符号:
- $ 静态(Static),例如:String someField$
定义关系
关系是一个通用术语,涵盖了类图和对象图中的特定类型逻辑连接。
[类A][箭头][类B]
目前支持UML下定义的类之间有八种不同类型的关系:
类型 | 描述 |
<|-- | 继承(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)
关系标签
可以在关系中添加标签文本:
[classA][Arrow][ClassB]:LabelText
classDiagram
classA <|-- classB : implements
classC *-- classD : composition
classE o-- classF : aggregation
双向关系
关系在逻辑上可以表示 N:M 关联:
classDiagram
Animal <|--|> Zebra
以下是语法:
[关系类型][连接符][关系类型] 其中,关系类型可以是以下之一:
类型 | 描述 |
<| | 继承 |
* | 组合 |
o | 聚合 |
> | 关联 |
< | 关联 |
|> | 实现 |
连接符可以是以下之一:
类型 | 描述 |
-- | 实线 |
.. | 虚线 |
定义命名空间
命名空间对类进行分组。
代码:
classDiagram
namespace BaseShapes {
class Triangle
class Rectangle {
double width
double height
}
}
关系的基数/多重性
类图中的多重性或基数表示一个类的实例数,这些实例可以链接到另一个类的实例。例如,每个公司将有一名或多名员工(不是零),并且每个员工目前在零家公司或一家公司工作。
多重性表示法放置在关联末尾附近。
不同的基数选项是:
1
Only 10..1
Zero or One1..*
One or more*
Manyn
n0..n
zero to n1..n
one to n
基数可以通过在给定箭头之前或之后的引号内放置文本选项来轻松定义。例如:
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText
代码:
classDiagram
Customer "1" --> "*" Ticket
Student "1" --> "1..*" Course
Galaxy --> "many" Star : Contains
类的注释
可以使用标记对类进行注释,以提供有关类的其他元数据。这可以更清楚地表明其性质。一些常见的注释包括:
<<Interface>>
表示接口类<<Abstract>>
表示抽象类<<Service>>
表示服务类<<Enumeration>>
表示枚举
注释在开始<<和结束>>中定义。有两种方法可以将注释添加到类,无论哪种方式,输出都是相同的:
- 在定义类后的单独行中:
classDiagram
class Shape
<<interface>> Shape
Shape : noOfVertices
Shape : draw()
- 在嵌套结构中以及类定义中:
classDiagram
class Shape{
<<interface>>
noOfVertices
draw()
}
class Color{
<<enumeration>>
RED
BLUE
GREEN
WHITE
BLACK
}
注释
注释可以在类图中输入,解析器将忽略该类图。注释需要位于其自己的行中,并且必须以 %%(双百分号)开头。下一个换行符之前的任何文本都将被视为注释,包括任何类图语法。
classDiagram
%% This whole line is a comment classDiagram class Shape <<interface>>
class Shape{
<<interface>>
noOfVertices
draw()
}
设置图表的方向
对于类图,您可以使用 direction 语句来设置图的呈现方向:
classDiagram
direction RL
class Student {
-idCard : IdCard
}
class IdCard{
-id : int
-name : string
}
class Bike{
-id : int
-name : string
}
Student "1" --o "1" IdCard : carries
Student "1" --o "1" Bike : rides
互动
可以将单击事件绑定到节点。单击可能会导致 javascript 回调或将在新的浏览器选项卡中打开的链接。 注意:此功能在使用 securityLevel='strict' 时被禁用,在使用 securityLevel='loose' 时启用。
在声明所有类后,您将在单独的行上定义这些操作。
action className "reference" "tooltip"
click className call callback() "tooltip"
click className href "url" "tooltip"
- 操作是链接或回调,具体取决于要调用的交互类型
- className 是操作将与之关联的节点的 ID
- 引用是 URL 链接或回调的函数名称。
- (可选)工具提示是将鼠标悬停在元素上时要显示的字符串(注意:工具提示的样式由类 .JHL 在线编辑Tooltip 设置。
- 注意:回调函数将以 nodeId 作为参数调用。
笔记
可以使用 在图表上添加注释。 可以使用以下命令为特定类别添加注释。note "line1\nline2"
note for <CLASS NAME> "line1\nline2"
例子:
classDiagram
note "This is a general note"
note for MyClass "This is a note for a class"
class MyClass{
}
URL Link:
classDiagram
class Shape
link Shape "https://www.github.com" "This is a tooltip for a link"
class Shape2
click Shape2 href "https://www.github.com" "This is a tooltip for a link"
Callback:
classDiagram
class Shape
callback Shape "callbackFunction" "This is a tooltip for a callback"
class Shape2
click Shape2 call callbackFunction() "This is a tooltip for a callback"
<script>
const callbackFunction = function () {
alert('A callback was triggered');
};
</script>
代码:
classDiagram
class Class01
class Class02
callback Class01 "callbackFunction" "Callback tooltip"
link Class02 "https://www.github.com" "This is a link"
class Class03
class Class04
click Class03 call callbackFunction() "Callback tooltip"
click Class04 href "https://www.github.com" "This is a link"
成功 工具提示功能和链接到 url 的功能从版本 0.5.2 开始提供。