第一部分: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
第三部分:以班級學生管理系統中的 —— “學生” 類為例
在班級管理系統中,學生是一個類,與此同時,課程、宿舍、成績與學生這個類也有着很大的關系。
class 課程 {
-課程號:int
-課程名:string
-主課教師:string
__
+課程信息
+選擇課程
}
class 學生{
-學號:int
-姓名:string
-班級:string
-專業:string
__
+登陸
+修改信息
+退出
+已選課程
+課程信息
}
class 宿舍 {
-宿舍號:int
-樓號:int
-所住人員:string
__
+登陸
+修改信息
+退出
}
class 成績 {
-課程號:int
-課程名:string
-考試成績:int
__
+課程信息
+查看成績
}
宿舍 -left-> 學生
學生 -down-> 成績
@enduml
第四部分:總結
類通常都是用一個矩形來表示,這個矩形分為三部分,最上面是類名,中間是類的屬性,最下面是類的操作。
通過類圖,能很清晰的就將系統中的各個類對象都描述清楚,然后再根據這些類圖來進行設計就非常的方便。
同時,也可以通過類圖來對與客戶的要求進行完善,以免出現軟件設計后卻不符合客戶要求的情況。