練習UML類圖中的類的表示


第一部分: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 linknote right on linknote bottom on link。(對應位置分別在label的左邊,右邊,下邊)

 抽象類和接口:

 用關鍵字abstractabstract class來定義抽象類。抽象類用斜體顯示。 也可以使用interface, annotationenum關鍵字。

 使用非字母字符:

 

如果你想在類(或者枚舉)的顯示中使用非字母字符,你可以:

  • 在類的定義中使用 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

第四部分:總結

 類通常都是用一個矩形來表示,這個矩形分為三部分,最上面是類名,中間是類的屬性,最下面是類的操作。

通過類圖,能很清晰的就將系統中的各個類對象都描述清楚,然后再根據這些類圖來進行設計就非常的方便。

 同時,也可以通過類圖來對與客戶的要求進行完善,以免出現軟件設計后卻不符合客戶要求的情況。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM