UML 類圖關係是物件導向設計的視覺化語言,精準表達類之間的結構與語義聯繫。本文系統講解六大關係的定義、UML 符號、Java 代碼映射、生命週期語義,並給出強弱排序與實戰辨析指南。
| 關係 | UML 符號 | 語義 | Java 代碼映射 | 強度 |
|---|---|---|---|---|
| 泛化 | 實線 + 空心三角箭頭 → 父類 | is-a,繼承結構與行為 | class Child extends Parent |
最強 |
| 實現 | 虛線 + 空心三角箭頭 → 介面 | 契約履行,like-a | class Impl implements Interface |
↑ |
| 組合 | 實線 + 實心菱形 → 整體 | contains-a,生命週期綁定 | class Whole { Part part = new Part(); } |
↑ |
| 聚合 | 實線 + 空心菱形 → 整體 | has-a,生命週期獨立 | class Whole { Part part; } // 外部注入 |
↑ |
| 關聯 | 實線 (可帶箭頭/角色/多重性) | 結構性知曉,平級關係 | class A { B b; } |
↑ |
| 依賴 | 虛線 + 箭頭 → 被依賴者 | use-a,臨時性使用 | 方法參數、局部變量、靜態方法調用 | 最弱 |
依賴 < 關聯 < 聚合 < 組合 < 實現/泛化
強度越強 = 耦合越緊 = 變更影響範圍越大。
class Animal { void breathe() {} }
class Tiger extends Animal { void hunt() {} }
// Tiger 擁有 Animal 所有非 private 成員
關鍵:子類是父類的特化,可替換性 (LSP)。
interface Flyable { void fly(); }
class Bird implements Flyable { public void fly() {} }
class Plane implements Flyable { public void fly() {} }
// Bird/Plane 可被 Flyable 引用統一對待
class Person {
// 方法參數依賴
void repair(Tool tool) { tool.use(); }
// 局部變量依賴
void work() { Hammer h = new Hammer(); h.swing(); }
// 靜態方法依賴
void calc() { Math.random(); }
}
特徵:不持有引用,關係隨方法調用結束而消失。原則:儘量降低依賴,避免循環依賴。
class Company {
private Employee employee; // 單向關聯
private List departments; // 一對多
}
class Employee {
private Company company; // 雙向關聯
}
代碼層面與聚合/組合無差別,純靠語義區分。
class School {
private List students; // 學生可轉學、畢業、獨立存在
public void enroll(Student s) { students.add(s); }
}
class Student { /* 獨立實體 */ }
class Window {
private List
| 判斷標準 | 關聯 | 聚合 | 組合 |
|---|---|---|---|
| 整體銷毀 → 部分銷毀 | 否 | 否 | 是 |
| 部分可被多整體共享 | 是 | 是 | 否 |
| 部分獨立業務意義 | 是 | 是 | 否 |
| 典型例子 | 師生、醫病 | 學校-學生、車輪-汽車 | 窗口-菜單、訂單-明細、房間-牆 |
| 關係 | 字段初始化 | 構造器職責 | 清理邏輯 |
|---|---|---|---|
| 關聯 | 外部注入 / 延遲賦值 | 不負責創建 | 不負責清理 |
| 聚合 | 外部注入 / setter 注入 | 不負責創建 | 不負責清理 |
| 組合 | 構造器中 new / 工廠方法 | 負責創建 | 負責清理 (dispose/close) |