首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

UML 類圖六大關係深度解析:泛化、實現、依賴、關聯、聚合、組合的語義、代碼映射與強弱排序

     編輯:Java 程式設計入門

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,臨時性使用 方法參數、局部變量、靜態方法調用 最弱

強弱排序鐵律

依賴 < 關聯 < 聚合 < 組合 < 實現/泛化

強度越強 = 耦合越緊 = 變更影響範圍越大。

逐個關係深度解析

1. 泛化 —— 繼承體系骨架

class Animal { void breathe() {} }
class Tiger extends Animal { void hunt() {} }
// Tiger 擁有 Animal 所有非 private 成員

關鍵:子類是父類的特化,可替換性 (LSP)。

2. 實現 —— 契約與實現分離

interface Flyable { void fly(); }
class Bird implements Flyable { public void fly() {} }
class Plane implements Flyable { public void fly() {} }
// Bird/Plane 可被 Flyable 引用統一對待

3. 依賴 —— 最弱、最常見、最易濫用

class Person {
    // 方法參數依賴
    void repair(Tool tool) { tool.use(); }
    // 局部變量依賴
    void work() { Hammer h = new Hammer(); h.swing(); }
    // 靜態方法依賴
    void calc() { Math.random(); }
}

特徵:不持有引用,關係隨方法調用結束而消失。原則:儘量降低依賴,避免循環依賴。

4. 關聯 —— 結構性知曉

class Company {
    private Employee employee; // 單向關聯
    private List departments; // 一對多
}
class Employee {
    private Company company; // 雙向關聯
}

代碼層面與聚合/組合無差別,純靠語義區分。

5. 聚合 —— has-a,整體-部分,生命週期獨立

class School {
    private List students; // 學生可轉學、畢業、獨立存在
    public void enroll(Student s) { students.add(s); }
}
class Student { /* 獨立實體 */ }
  • 部分可被多個整體共享 (學生可同時屬於學校和培訓班)
  • 整體銷毀不級聯銷毀部分

6. 組合 —— contains-a,強擁有,生命週期綁定

class Window {
    private List menus = new ArrayList<>(); // 窗口創建時創建菜單
    public Window() { menus.add(new Menu("文件")); }
}
class Menu { /* 無窗口無意義 */ }
  • 部分與整體同生共死
  • 部分不可被外部直接訪問/共享
  • 整體負責部分的完整生命週期管理

實戰辨析:關聯 vs 聚合 vs 組合

判斷標準關聯聚合組合
整體銷毀 → 部分銷毀否否是
部分可被多整體共享是是否
部分獨立業務意義是是否
典型例子師生、醫病學校-學生、車輪-汽車窗口-菜單、訂單-明細、房間-牆

代碼層面實現差異(細節決定成敗)

關係字段初始化構造器職責清理邏輯
關聯外部注入 / 延遲賦值不負責創建不負責清理
聚合外部注入 / setter 注入不負責創建不負責清理
組合構造器中 new / 工廠方法負責創建負責清理 (dispose/close)

設計原則建議

  1. 優先用關聯/依賴:能用弱關係不用強關係
  2. 謹慎用繼承:組合優於繼承,介面隔離變化
  3. 明確生命週期歸屬:誰創建誰銷毀,文檔化標註組合關係
  4. 避免雙向關聯:單向知曉即可,雙向增加維護負擔
  5. 領域建模驅動:根據業務語義決定關係,而非代碼結構倒推
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved