UML 類圖是面向?qū)ο笤O(shè)計(jì)的 “施工圖”,而依賴、繼承、實(shí)現(xiàn)、關(guān)聯(lián)、聚合、組合這六大關(guān)系,就是圖中定義類與類互動(dòng)規(guī)則的核心 “語(yǔ)法”。掌握它們,就能快速看懂類的協(xié)作邏輯與系統(tǒng)結(jié)構(gòu)
1 UML 類圖基礎(chǔ)
UML類圖的基本單元,類如下所示
+----------------+
| Animal | // 類名
+----------------+
| - name: String | // 屬性(private)
| - age: int |
+----------------+
| + eat(): void | // 方法(public)
| + sleep(): void|
+----------------+
通常是一個(gè)三層矩形框,從上到下分別對(duì)應(yīng):
- 第一層:類名(抽象類名用斜體表示);
- 第二層:屬性(格式為 “可見(jiàn)性 屬性名:類型”,如 “- name: String” );
- 第三層:方法(格式為 “可見(jiàn)性 方法名 (參數(shù)): 返回值類型”,如 “+ eat (): void” )。
“-” 代表 private,“+” 代表 public,"#"表示protected
2 六大關(guān)系圖解:從符號(hào)到本質(zhì)
2.1 繼承
繼承是面向?qū)ο?a target="_blank">編程中的一個(gè)基本概念,指的是子類繼承父類的屬性和方法
繼承用于代碼復(fù)用和建立類之間的層次關(guān)系,形成 is-a 關(guān)系
// 基類(父類)
class Animal {
public:
// 普通方法(會(huì)被繼承)
void drink() {
cout < < "Animal is drinking" < < endl;
}
// 虛函數(shù)(用于多態(tài))
virtual void sound() = 0; // 純虛函數(shù)(抽象方法)
};
// 繼承示例(派生類)
class People : public Animal { // 使用繼承(is-a 關(guān)系)
public:
// 實(shí)現(xiàn)基類的純虛函數(shù)(必須實(shí)現(xiàn))
void sound() override {
cout < < "hello world!" < < endl;
}
};
UML 符號(hào)使用帶空心三角形的實(shí)線(三角形指向父類,即 “誰(shuí)是父,箭頭指誰(shuí)”)

2.2實(shí)現(xiàn)
實(shí)現(xiàn)通常指的是接口的實(shí)現(xiàn),但C++本身并沒(méi)有像Java那樣的接口關(guān)鍵字,所以可能需要用抽象類來(lái)模擬接口,形成 can-do 關(guān)系
實(shí)現(xiàn)(通過(guò)抽象類)用于定義必須由子類實(shí)現(xiàn)的方法,確保多態(tài)性
在c++中,
// 實(shí)現(xiàn)示例(接口模式)
class Eating { // 模擬接口(沒(méi)有成員變量)
public:
virtual void eat() = 0; // 純虛函數(shù)(必須實(shí)現(xiàn))
virtual ~Eating() {} // 虛析構(gòu)函數(shù)
};
class People : public Animal, public Eating { // 多繼承(實(shí)現(xiàn)多個(gè)接口)
public:
// 實(shí)現(xiàn) Animal 的抽象方法
void sound() override {
cout < < "Chirp!" < < endl;
}
// 實(shí)現(xiàn) Eating 的接口方法
void eat() override {
cout < < "Bird is eating" < < endl;
}
};
UML 符號(hào)使用帶空心三角形的虛線(三角形指向接口,即 “誰(shuí)是接口,箭頭指誰(shuí)”)

2.3依賴
依賴是一種比較弱的關(guān)系,表示一個(gè)類使用另一個(gè)類,但生命周期上沒(méi)有必然聯(lián)系。比如,一個(gè)方法參數(shù)中使用了另一個(gè)類的對(duì)象,或者局部變量。這種情況下,當(dāng)方法執(zhí)行完畢,依賴的對(duì)象可能就被銷毀了,抽象地說(shuō),類 A 的某個(gè)方法使用類 B 的對(duì)象,但 B 的對(duì)象并非 A 的成員變量,而是通過(guò)參數(shù)、局部變量或靜態(tài)方法調(diào)用臨時(shí)使用。
#include < iostream >
using namespace std;
class Food {
private:
int eggs;
};
class People {
public:
// 依賴關(guān)系:通過(guò)方法參數(shù)使用 Foodl
void eat(Food *food) {
eat.food();
}
};
UML 符號(hào)使用帶箭頭的虛線(箭頭指向被依賴的類,即 “誰(shuí)被用,箭頭指誰(shuí)”)

2.4關(guān)聯(lián)
關(guān)聯(lián)表示長(zhǎng)期的結(jié)構(gòu)性聯(lián)系,表示更強(qiáng)的關(guān)系,通常表示成員變量,一個(gè)類包含另一個(gè)類的實(shí)例作為屬性。關(guān)聯(lián)有方向性,可以是單向或雙向,但生命周期上,關(guān)聯(lián)的對(duì)象通常由另一個(gè)類管理,比如作為成員變量存在,生命周期和包含它的對(duì)象一致
class People {
private:
chai *home;
Home *home
public:
work()
};
class Home {
private:
char* addr;
};
UML 符號(hào)使用帶箭頭的實(shí)線(單向關(guān)聯(lián)箭頭指向被關(guān)聯(lián)方;雙向關(guān)聯(lián)無(wú)箭頭,或用雙向箭頭)

2.5 聚合
整體與部分具有弱依賴關(guān)系,部分的生命周期獨(dú)立于整體。部分可以屬于多個(gè)整體或獨(dú)立存在。典型的 "has-a" 關(guān)系
#include < iostream >
using namespace std;
class People {
private:
char *name;
chai *home;
public:
work()
};
class Company {
private:
People* people; // 關(guān)聯(lián)關(guān)系:成員變量指向 People 對(duì)象
public:
Company(People* p) : People(p) {} // 通過(guò)構(gòu)造函數(shù)傳入 People 對(duì)象
void work() {
people- >work(); // 使用關(guān)聯(lián)的 People 對(duì)象
}
};
UML 符號(hào)使用帶空心菱形的實(shí)線(菱形在 “整體” 側(cè),箭頭指向 “部分”)

2.6組合
整體與部分具有強(qiáng)依賴關(guān)系,部分的生命周期由整體管理。部分不能獨(dú)立于整體存在。
整體類持有部分類的對(duì)象實(shí)例,部分在整體構(gòu)造時(shí)創(chuàng)建,整體銷毀時(shí)自動(dòng)銷毀)。
#include < iostream >
using namespace std;
class Heart {
public:
void beat() {
cout < < "Heart is beating" < < endl;
}
~Heart() {
cout < < "Heart destroyed" < < endl;
}
};
class People {
private:
Heart heart; // 組合關(guān)系:Heart 是 Person 的組成部分
public:
void live() {
heart.beat();
}
~People() {
cout < < "People destroyed" < < endl;
}
};
UML 符號(hào)使用帶實(shí)心菱形的實(shí)線(菱形在 “整體” 側(cè),箭頭指向 “部分”)

3對(duì)比
| 繼承 | 實(shí)現(xiàn) | 依賴 | 關(guān)聯(lián) | 組合 | 聚合 | |
|---|---|---|---|---|---|---|
| 關(guān)系強(qiáng)度 | "is-a" 關(guān)系 | "can-do" 關(guān)系 | 弱(臨時(shí)使用) | 強(qiáng)(長(zhǎng)期持有) | 強(qiáng)(部分依賴整體) | 弱(部分獨(dú)立存在) |
| 生命周期 | 父類與子類生命周期通常獨(dú)立 | 接口類不管理對(duì)象生命周期,由實(shí)現(xiàn)類負(fù)責(zé) | 方法調(diào)用期間存在 | 對(duì)象實(shí)例化時(shí)建立,銷毀時(shí)結(jié)束 | 整體管理部分生命周期 | 部分生命周期獨(dú)立 |
| 代碼體現(xiàn) | 通過(guò)虛函數(shù)實(shí)現(xiàn)運(yùn)行時(shí)多態(tài) | 通過(guò)純虛函數(shù)定義接口,實(shí)現(xiàn)類提供具體實(shí)現(xiàn) | 方法參數(shù)、局部變量、靜態(tài)方法調(diào)用 | 成員變量(對(duì)象、指針或引用) | 成員變量為對(duì)象(非指針) | 成員變量為指針或引用 |
| 對(duì)象管理 | 不管理對(duì)象生命周期 | 可能管理對(duì)象生命周期(如通過(guò)值或指針) | 整體析構(gòu)時(shí)自動(dòng)銷毀部分 | 整體析構(gòu)時(shí)不銷毀部分 | ||
| 典型場(chǎng)景 | 生物分類(如貓繼承動(dòng)物) | 技能規(guī)范(如飛行接口) | 工具類使用(如 Worker 使用 Tool) | 實(shí)體間聯(lián)系(如 Student 與 Teacher) | 生物器官與生物體(如心臟與人類) | 集合與元素(如班級(jí)與學(xué)生) |
| UML表示 | 空心三角形+實(shí)線 | 空心三角形+虛線 | 虛線箭頭(-->) | 實(shí)線箭頭(→) | 實(shí)心菱形箭頭(?→) | 空心菱形箭頭(◇→) |
4實(shí)戰(zhàn)技巧:如何快速識(shí)別關(guān)系?
- 先看 “箭頭與形狀”:菱形代表 “整體 - 部分”(空心 = 聚合,實(shí)心 = 組合),三角形代表 “層級(jí) / 契約”(實(shí)線 = 繼承,虛線 = 實(shí)現(xiàn));
- 再判 “強(qiáng)弱與生命周期”:臨時(shí)用 = 依賴,長(zhǎng)期持用 = 關(guān)聯(lián),部分能獨(dú)立 = 聚合,部分不能獨(dú)立 = 組合;
- 最后對(duì)應(yīng) “業(yè)務(wù)語(yǔ)義”:說(shuō) “是 XX” 找繼承,說(shuō) “能 XX” 找實(shí)現(xiàn),說(shuō) “有 XX” 看關(guān)聯(lián) / 聚合 / 組合。

審核編輯 黃宇
-
UML
+關(guān)注
關(guān)注
0文章
123瀏覽量
31588
發(fā)布評(píng)論請(qǐng)先 登錄
如何分辨五類六類網(wǎng)線
超六類網(wǎng)線如何選擇
六類跳線VS超五類/超六類——如何選擇“網(wǎng)絡(luò)血管”?
超六類網(wǎng)線水晶頭和六類水晶頭通用嗎
國(guó)巨AC0603車規(guī)MLCC家族在六大系統(tǒng)的典型應(yīng)用
超六類跳線是否可以接到六類配線架
五類網(wǎng)線接口能插六類網(wǎng)線嗎
網(wǎng)線面板分五類六類嗎
五類網(wǎng)線能用六類水晶頭嗎
六類超速網(wǎng)線屬于超六類網(wǎng)線嗎
六類網(wǎng)線和超六類網(wǎng)線有什么區(qū)別
六類網(wǎng)線有幾層護(hù)套
6E是不是超六類網(wǎng)線
超六類水晶頭和六類水晶頭一樣嗎
圖解碼說(shuō)-六大UML類圖關(guān)系(依賴,繼承,實(shí)現(xiàn),關(guān)聯(lián),聚合,組合)
評(píng)論