第一部分:UML类图(class diagram)
类图用来展现一组类、类的特性以及其类相互之间的关系,一个类图由一组类以及它们之间的关系构成,类图用来对系统的领域概念以及静态结构进行建模。
在软件模型中,类图是最基本、也最重要的一种图。
类图中的元素有类、接口、协作、关系、注释、约束和包。
类的关系主要有关联、组成、泛化、依赖和接口的实现。
类图的作用主要有以下三点:
- 在软件空间中建立对问题空间抽象的结构映像。
- 用例分析和设计的逻辑结构建模。
- 数据库结构建模。
第二部分:PlantUML类图语法
基本语法:
类之间的关系通过下面的符号定义 :
Type | Symbol | Drawing |
Extension(扩展) | <|-- |
|
Composition(组合) | *-- |
|
Aggregation(聚合) | o-- |
|
使用..
来代替 --
可以得到点 线.
例如:
1 @startuml
2 Class01 <|-- Class02
3 Class03 *-- Class04
4 Class05 o-- Class06
5 Class07 .. Class08
6 Class09 -- Class10
7 @enduml
1 @startuml
2 Class11 <|.. Class12
3 Class13 --> Class14
4 Class15 ..> Class16
5 Class17 ..|> Class18
6 Class19 <--* Class20
7 @enduml
1 @startuml
2 Class21 #-- Class22
3 Class23 x-- Class24
4 Class25 }-- Class26
5 Class27 +-- Class28
6 Class29 ^-- Class30
7 @enduml
在关系之间使用标签来说明时, 使用 :
后接 标签文字。
对元素的说明,你可以在每一边使用 ""
来说明.例如:
1 @startuml
2
3 Class01 "1" *-- "many" Class02 : contains
4
5 Class03 o-- Class04 : aggregation
6
7 Class05 --> "1" Class06
8
9 @enduml
在标签的开始或结束位置添加<
或 >
以表明是哪个对象作用到哪个对象上。
1 @startuml
2 class Car
3
4 Driver - Car : drives >
5 Car *- Wheel : have 4 >
6 Car -- Person : < owns
7
8 @enduml
添加方法:
为了声明域或者方法,你可以使用 后接域名或方法名。
系统检查是否有括号来判断是方法还是域。例如:
1 @startuml
2 Object <|-- ArrayList
3
4 Object : equals()
5 ArrayList : Object[] elementData
6 ArrayList : size()
7
8 @enduml
也可以使用{}
把域或者方法括起来。注意,这种语法对于类型/名字的顺序是非常灵活的。
@startuml
class Dummy {
String data
void methods()
}
class Flight {
flightNumber : Integer
departureTime : Date
}
@enduml
1 @startuml
2 class Dummy {
3 {field} A field (despite parentheses)
4 {method} Some method
5 }
6
7 @enduml
定义可访问性:
一旦你定义了域或者方法,你可以定义 相应条目的可访问性质。
Character | Icon for field | Icon for method | Visibility |
| private | ||
| protected | ||
| package private | ||
| public |
1 @startuml
2
3 class Dummy {
4 -field1
5 #field2
6 ~method1()
7 +method2()
8 }
9
10 @enduml
你可以采用以下命令停用这些特性 skinparam classAttributeIconSize 0
:
1 @startuml
2 skinparam classAttributeIconSize 0
3 class Dummy {
4 -field1
5 #field2
6 ~method1()
7 +method2()
8 }
9
10 @enduml
抽象与静态:
通过修饰符{static}
或者{abstract}
,可以定义静态或者抽象的方法或者属性。这些修饰符可以写在行的开始或者结束。也可以使用{classifier}
这个修饰符来代替{static}
.
1 @startuml
2 class Dummy {
3 {static} String id
4 {abstract} void methods()
5 }
6 @enduml
高级类体:
PlantUML默认自动将方法和属性重新分组,你可以自己定义分隔符来重排方法和属性,下面的分隔符都是可用的:--
..
==
__
.
还可以在分隔符中添加标题:
@startuml
class Foo1 {
You can use
several lines
..
as you want
and group
==
things together.
__
You can have as many groups
as you want
--
End of class
}
class User {
.. Simple Getter ..
+ getName()
+ getAddress()
.. Some setter ..
+ setName()
__ private data __
int age
-- encrypted --
String password
}
@enduml
备注和模板:
模板通过类关键字("<<"和">>")来定义
你可以使用note left of
, note right of
, note top of
, note bottom of
这些关键字来添加备注。
你还可以在类的声明末尾使用note left
, note right
,note top
, note bottom
来添加备注。
此外,单独用note
这个关键字也是可以的,使用 ..
符号可以作出一条连接它与其它对象的虚线。
链接的注释:
在定义链接之后,你可以用 note on link
给链接添加注释
如果想要改变注释相对于标签的位置,你也可以用 note left on link
, note right on link
, note bottom on link
。(对应位置分别在label的左边,右边,下边)
抽象类和接口:
用关键字abstract
或abstract class
来定义抽象类。抽象类用斜体显示。 也可以使用interface
, annotation
和 enum
关键字。
使用非字母字符:
如果你想在类(或者枚举)的显示中使用非字母字符,你可以:
- 在类的定义中使用
as
关键字 - 在类名旁边加上
""
1 @startuml
2 class "This is my class" as class1
3 class class2 as "It works this way too"
4
5 class2 *-- "foo/dummy" : use
6 @enduml
隐藏类:
你也可以使用 show/hide
命令来隐藏类
如果你定义了一个大的!included文件,且想在文件包含之后隐藏部分类,该功能会很有帮助。
泛型(generics):
你可以用 <
和 >
来定义类的泛型。
1 @startuml
2
3 class Foo<? extends Element> {
4 int size()
5 }
6 Foo *- Element
7
8 @enduml
指定标记(Spot):
通常标记字符 (C, I, E or A) 用于标记 类(classes), 接口(interface), 枚举(enum)和 抽象类(abstract classes).
但是当你想定义原型时,可以增加对应的单个字符及颜色,来定义自己的标记(spot),就像下面一样:
1 @startuml
2
3 class System << (S,#FF7700) Singleton >>
4 class Date << (D,orchid) >>
5 @enduml
包
你可以通过关键词 package
声明包,同时可选的来声明对应的背景色(通过使用html色彩代码或名称)。
注意:包可以被定义为嵌套。
1 @startuml
2
3 package "Classic Collections" #DDDDDD {
4 Object <|-- ArrayList
5 }
6
7 package net.sourceforge.plantuml {
8 Object <|-- Demo1
9 Demo1 *- Demo2
10 }
11
12 @enduml
包样式:
包可以定义不同的样式。
你可以通过以下的命令来设置默认样式 : skinparam packageStyle
,或者对包使用对应的模板:
1 @startuml
2 scale 750 width
3 package foo1 <<Node>> {
4 class Class1
5 }
6
7 package foo2 <<Rectangle>> {
8 class Class2
9 }
10
11 package foo3 <<Folder>> {
12 class Class3
13 }
14
15 package foo4 <<Frame>> {
16 class Class4
17 }
18
19 package foo5 <<Cloud>> {
20 class Class5
21 }
22
23 package foo6 <<Database>> {
24 class Class6
25 }
26
27 @enduml
你也可以参考下面的示例来定义包之间的连线:
1 @startuml
2
3 skinparam packageStyle rectangle
4
5 package foo1.foo2 {
6 }
7
8 package foo1.foo2.foo3 {
9 class Object
10 }
11
12 foo1.foo2 +-- foo1.foo2.foo3
13
14 @enduml
第三部分:以班级学生管理系统中的 —— “学生” 类为例
在班级管理系统中,学生是一个类,与此同时,课程、宿舍、成绩与学生这个类也有着很大的关系。
@startuml
class 课程 {
-课程号:int
-课程名:string
-主课教师:string
__
+课程信息
+选择课程
}
class 学生{
-学号:int
-姓名:string
-班级:string
-专业:string
__
+登陆
+修改信息
+退出
+已选课程
+课程信息
}
class 宿舍 {
-宿舍号:int
-楼号:int
-所住人员:string
__
+登陆
+修改信息
+退出
}
class 成绩 {
-课程号:int
-课程名:string
-考试成绩:int
__
+课程信息
+查看成绩
}
课程 -right-> 学生
宿舍 -left-> 学生
学生 -down-> 成绩
@enduml
第四部分:总结
类通常都是用一个矩形来表示,这个矩形分为三部分,最上面是类名,中间是类的属性,最下面是类的操作。
通过类图,能很清晰的就将系统中的各个类对象都描述清楚,然后再根据这些类图来进行设计就非常的方便。
同时,也可以通过类图来对与客户的要求进行完善,以免出现软件设计后却不符合客户要求的情况。