UML 類別圖是物件導向分析設計的核心工具。六種關係由強到弱依序為:泛化、實現、組合、聚合、關聯、依賴。本文逐一解析定義、箭頭表示、程式碼對應與實務應用場景。
泛化 = 實現 > 組合 > 聚合 > 關聯 > 依賴
定義:繼承關係,表達「is-a」關係,子類別特化父類別。
箭頭:實線 + 空心三角箭頭 → 指向父類別
程式碼:class Child extends Parent
範例:老虎 → 動物
定義:類別實作介面,表達「can-do」關係。
箭頭:虛線 + 空心三角箭頭 → 指向介面
程式碼:class Impl implements Interface
範例:ArrayList → List
定義:結構性關係,一個類別知道另一個類別的屬性與方法,表達「has-a」。可單向、雙向、自我關聯。
箭頭:實線 + 實心箭頭 → 指向被擁有者(雙向可無箭頭或雙箭頭)
程式碼:成員變數
class Teacher {
List<Student> students; // 雙向關聯
Course course; // 單向關聯
}
定義:整體與部分關係,部分可脫離整體獨立存在(弱擁有)。
箭頭:實線 + 空心菱形 → 菱形指向整體
程式碼:成員變數(語法上與關聯無異,靠語意區分)
範例:汽車 ↔ 輪胎(輪胎可拆卸單獨存在)
定義:整體與部分關係,部分不可脫離整體獨立存在(強擁有),整體負責部分生命週期。
箭頭:實線 + 實心菱形 → 菱形指向整體
程式碼:成員變數,通常在建構子中初始化
範例:公司 ↔ 部門(無公司則無部門)
定義:使用關係,一個類別實作需要另一個類別協助,盡量避免雙向依賴。
箭頭:虛線 + 實心箭頭 → 指向被使用者
程式碼:區域變數、方法參數、靜態方法呼叫
class OrderService {
public void process(Order order) { // 參數依賴
EmailUtil.send(order.getEmail()); // 靜態方法依賴
}
}
| 關係 | 生命週期綁定 | 可否共享 | 典型場景 |
|---|---|---|---|
| 組合 | 是(同生共死) | 否 | House-Room, Order-OrderItem |
| 聚合 | 否 | 是 | Car-Wheel, Department-Employee |
| 關聯 | 否 | 是 | Teacher-Student, User-Address |