UML 圖分類總覽
UML 2.x 定義 14 種圖,分為結構圖(靜態)與行為圖(動態)兩大類:
| 類別 | 圖類型 | 核心用途 | 關鍵元素 |
| 結構圖 | 類別圖 | 系統靜態結構:類、介面、關係、屬性、方法 | 類、介面、泛化、實現、關聯、聚合、組合、依賴 |
| 物件圖 | 特定時刻的類別實例快照 | 物件、連結、屬性值 |
| 元件圖 | 實體元件與依賴關係 | 元件、介面、埠、連接器、組件 |
| 部署圖 | 硬體節點與軟體部署拓撲 | 節點、制品、部署規範、執行環境 |
| 封裝圖 | 模型組織與可見性 | 套件、匯入、存取控制 |
| 複合結構圖 | 類別內部結構與協作 | 部件、連接器、埠、協作 |
| 剖面圖 | UML 擴充機制 | 型別、刻板印象、元類別 |
| 行為圖 | 用例圖 | 系統功能需求與參與者互動 | 參與者、用例、關聯、包含、擴充、泛化 |
| 序列圖 | 物件間訊息時間順序 | 生命線、訊息、片段、互動用途 |
| 通訊圖 | 物件間結構化訊息傳遞 | 物件、關聯、訊息編號 |
| 時序圖 | 狀態隨時間變化的約束 | 生命線、狀態、時間約束、持續觀察 |
| 活動圖 | 流程邏輯與業務流程 | 動作、決策/合併節點、分叉/合併、游泳道 |
| 狀態機圖 | 物件生命週期狀態轉換 | 狀態、轉換、事件、守衛條件、動作 |
| 互動概觀圖 | 互動片段的高層流程 | 互動用途、決策/合併、分叉/合併 |
核心關係符號速查(類別圖/物件圖)
| 關係 | 符號 | 語意 | 程式碼映射 | 強度 |
| 泛化 | 實線空心三角箭頭 → 父類 | 繼承:子類是父類的一種 | class Child extends Parent | 最強 |
| 實現 | 虛線空心三角箭頭 → 介面 | 實作介面契約 | class Impl implements Interface | 最強 |
| 組合 | 實線實心菱形 → 整體 | 強擁有:部分與整體同生共死 | 成員變數 new Part() 在建構子初始化 | 強 |
| 聚合 | 實線空心菱形 → 整體 | 弱擁有:部分可獨立存在 | 成員變數,透過建構子/Setter 注入 | 中 |
| 關聯 | 實線箭頭(可雙向/單向) | 結構性關係:知道對方 | 成員變數 | 中 |
| 依賴 | 虛線箭頭 → 被依賴者 | 臨時使用:參數、區域變數、靜態方法呼叫 | 方法參數、區域變數、Class.staticMethod() | 最弱 |
關係強度排序
泛化 = 實現 > 組合 > 聚合 > 關聯 > 依賴
可見性符號
| 修飾符 | 符號 | 範例 |
| public | + | + getName() : String |
| private | - | - name : String |
| protected | # | # calculateTax() : double |
| package-private | ~ | ~ validate() : boolean |
常用圖範例說明
類別圖關鍵要素
+---------------------+
| Order |
+---------------------+
| - id : Long |
| - status : Enum |
| + addItem() : void |
| + calculateTotal() |
+---------------------+
▲
| 泛化
|
+---------------------+
| OnlineOrder |
+---------------------+
| - trackingNo : String|
+---------------------+
序列圖核心元素
- 生命線:參與者/物件的垂直虛線,頂端為類別名稱。
- 訊息:實線箭頭(同步呼叫)、虛線箭頭(回傳/非同步)、實線實心箭頭(建立物件)。
- 片段:
alt(替選)、opt(可選)、loop(迴圈)、par(平行)。
活動圖核心元素
- 動作:圓角矩形,代表具體步驟。
- 決策/合併節點:菱形,守衛條件控制流向。
- 分叉/合併:粗實線,平行執行與同步等待。
- 游泳道:垂直/水平分區,劃分職責(如前台/後台/系統)。
繪圖工具推薦
- PlantUML:文字描述生成圖表,版控友善,IDE 整合佳。
- Mermaid:Markdown 內嵌,GitHub/GitLab 原生渲染。
- StarUML / Visual Paradigm:GUI 拖拉,適合正式文件產出。
- draw.io (diagrams.net):免費線上/離線,雲端同步。
PlantUML 快速範例
@startuml
class User {
- id: Long
- name: String
+ getName(): String
}
class Order {
- id: Long
- user: User
+ getUser(): User
}
Order *-- User : "聚合/關聯"
@enduml
最佳實踐建議
- 根據溝通對象選擇圖類:業務溝通用用例圖/活動圖;技術設計用類別圖/序列圖。
- 圖表聚焦單一主題,避免一圖塞滿所有細節。
- 關係箭頭方向指向被依賴/被繼承者,別畫反。
- 配合刻板印象(
<<interface>>、<<entity>>、<<service>>)增強語意。
- 將圖表納入版本控制(PlantUML/Mermaid 原始碼),實現文件與代碼同步演進。