一、 UML 是什麼
定義
UML 是統一模組化語言, 是一種開放的方法,用于說明、可視化、建構和編寫一個正在開發的、面向對象的、軟體密集系統的制品的開放方法。
統一模組化語言(Unified Modeling Language,UML)是一種為面向對象系統的産品進行說明、可視化和編制文檔的一種标準語言,是非專利的第三代模組化和規約語言。UML是面向對象設計的模組化工具,獨立于任何具體程式設計語言。
UML 本身是一套符号的規定,就像數學符号和化學符号一樣,這些符号用于描述軟體模型中的各個元素和他 們之間的關系,比如類、接口、實作、泛化、依賴、組合、聚合等。
作用
- 幫組開發團隊以一種可視化的方式了解系統的功能需求。
- 有利于開發團隊隊員之間在各個開發環節間确立溝通的标準,便于系統文檔的制定和項目的管理。因為 UML 的簡單、直覺和标準性,在一個團隊中用 UML 來交流比用文字說明的文檔要好的多。
- UML 為非專業程式設計人士了解軟體的功能和構造,提供了一種直白、簡單、通俗的方法。
- 使用 UML 可以友善的了解各種架構的設計方式。
二、 UML 畫圖的工具推薦
- MarkDown
- PlantUML
- Draw.io (Mac)
- PowerDesigner (Windows)
工作中第一個常用用來寫文檔,二三個用來畫UML圖比較多(推薦結合使用)。
隻要掌握常用的幾種圖 (用例圖、類圖、時序圖、活動圖) ,就已經邁向架構第一步了,工作學習中交流起來就容易多了。
三、UML 類圖中的關系
在 UML 類圖中,常見的有以下幾種關系:
- 泛化(Generalization)(繼承)
- 實作(Realization)
- 關聯(Association)
- 聚合(Aggregation)
- 組合(Composition)
- 依賴(Dependency)
他們的強弱級别為:
泛化 = 實作 > 組合 > 聚合 > 關聯 > 依賴
UML 類與類之間的關系表示總覽:
以下 UML 圖用的是 Draw.io 來畫的,開源位址:https://github.com/jgraph/drawio
1. 泛化(繼承)
【泛化關系】:是一種繼承關系,表示一般與特殊的關系,它指定了子類如何特化父類的所有特征和行為。
【例如】:男人是人的一種,既有男人的特性也有人的共性。女人也是如此。
【箭頭指向】:帶三角箭頭的實線,箭頭指向父類。
2. 實作(Realization)
【實作關系】:是一種類與接口的關系,表示類是接口所有特征和行為的實作。
【例如】:USB 是一個接口,每一個電腦都可以插上 USB 這個接口。
【箭頭指向】:帶三角箭頭的虛線,箭頭指向接口。
3. 關聯(Association)
【關聯關系】:是一種擁有的關系,它使一個類知道另一個類的屬性和方法。關聯可以是雙向的,也可以是單向的。
【例如】:老師與學生是雙向關聯,老師有多名學生,學生也可能有多名老師。但學生與某課程間的關系為單向關聯,一名學生可能要上多門課程,課程是個抽象的東西,他不擁有學生。
【代碼展現】:成員變量。
【箭頭及指向】:雙向的關聯可以有兩個箭頭或者沒有箭頭,單向的關聯有一個箭頭。
4. 聚合(Aggregation)
【聚合關系】:是整體與部分的關系,可以看成 「has-a」 的關系,部分可以離開整體而單獨存在。
【例如】:電腦和鍵盤是整體和部分的關系,電腦沒了鍵盤仍然可以存在。
【代碼展現】:成員變量。
【箭頭及指向】:帶空心菱形的實心線,菱形指向整體。
5. 組合(Composition)
聚合關系】:是整體與部分的關系,可以看成 「contains-a」 的關系,部分離開整體後無法單獨存在。
【例如】:鳥兒和翅膀是整體和部分的關系,鳥兒沒了翅膀不能獨立存在。
【代碼展現】:成員變量。
【箭頭及指向】:帶實心菱形的實心線,菱形指向整體。
6. 依賴(Dependency)
【聚合關系】:是一種使用的關系,即一個類的實作需要另一個類的協助,是以要盡量不使用雙向的互相依賴。
【例如】:人依賴計算機實作玩電腦遊戲的目的。
【代碼展現】:局部變量、方法的參數或者對靜态方法的調用。
【箭頭及指向】:帶箭頭的虛線,指向被使用者。
如果要畫項目的設計圖,有很多類的關系圖,這個軟體可以使用。如果需要快速在設計某個功能時也可以使用 PlantUML 來實作,怎麼快怎麼來。
可以在網頁上畫,在 IDE中也有插件 :
比如我在總結設計模式系列時,就用這個來畫。
用代碼來直接渲染生成UML 設計圖檔
代碼如下:
@startuml
skinparam classAttributeIconSize 0
package "class ChainOfResponsibility(責任鍊模式)" {
abstract class Handler
{
#setSuccessor(Handler)
+handle():void
}
note left: 抽象處理者
class HandlerA
{
+handle():void
}
class HandlerB
{
+handle():void
}
class HandlerC
{
+handle():void
}
Handler o-- Handler:0..1
Handler <|-- HandlerA
Handler <|-- HandlerB
Handler <|-- HandlerC
Client ..> Handler
}
@enduml
四、小結
- PlantUml