文章目錄
- 前言
- 繼承
- 實作
- 組合
- 聚合
- 關聯
- 依賴
- 總結
前言
小編采用代碼與圖(IDE逆向工程生成)對應的方式進行輸出此篇內容,
眾所周知,uml六種關系強弱表示:繼承>實作>組合>聚合>關聯>依賴,下文就以從強到弱的關系一一進行介紹,
繼承
public class Jeep extends Car {
}

實作
public class Car implements Fly {
}

組合
小編使用的IDE工具是IDEA,在IDEA逆向工程生成的圖中,組合,聚合,關聯三種關系用的同一種方式展現,
public class Car{
private Framework framework;
public Car() {
this.framework = new Framework(null);
}
}

上面類Car與類Framework的關系如圖所示,一條依賴關系<<create>>,一條關聯關系(在idea生成的圖中關聯,聚合,組合關系用同一種方式表示,)在這里,最弱的關系是關聯,所以,二者間至少是關聯關系,其中,菱形指向的一方代表整體,而箭頭指向的一方代表區域,1代表在1個Car類中有1個Framework類實體,
其中,把代碼中Car構造方法去掉,就會發現類間關系變成了只有一個關聯關系(上圖中Car與Framework右側的線),可得,在構造方法中創建Framework類的實體代表的是 依賴關系<<create>>這條線,
而為什么小編得出上面的代碼就是組合關系呢??別急,我們和聚合關系對比來看,
聚合
public class Car{
private Framework framework;
public Car(Framework framework) {
this.framework = framework;
}
}

我們可以看到通過代碼逆向工程生成的圖中,類Car與類Framework間關系是:一條依賴關系,一條關聯關系,和組合中的做法相同,我們把Car構造方法代碼去掉,會發現只剩下關聯關系,所以,Car構造方法中代表的是兩個類間的 依賴關系,
這種寫法和組合中的代碼有什么不同呢?一個是在構造方法中實體化另一個類,一個是通過引數將另一個類的實體傳進來,我們思考一下組合和聚合的區別就能輕易得出,這兩個情況分別代表的關系,
由此得出,依賴關系上帶有 <<create>>標志的關系相對于不帶有 <<create>>標志的耦合更強一些,也就是關系更強,由此,得出結論:在Idea逆向工程生成的圖中,依賴關系 <<create>>標志+關聯,可以理解為組合關系,而普通依賴關系+關聯,可以理解為聚合關系,當然,組合和聚合關系的前提是關聯關系,(代碼體現也就是Car類內部,方法外部宣告的 Framework 類變數)
關聯
public class Car{
private Framework framework;
}

了解了組合和聚合關系后,我們對關聯關系自然也明白了,因為關聯關系是聚合和組合的基礎,在類A內部,方法外部宣告的類B的變數,這兩類間的關系就可以說成是關聯關系,因為類B變數的生命周期與類A是相同的,比依賴關系要強,所以,是關系關系,但確定了關聯關系后再尋找更強的關系,還需要進一步觀察代碼,
依賴
依賴關系在代碼中有三種體現:
- 引數
- 回傳值
- 方法內變數
// 類Car與類Framework
public class Car{
//case 1:引數
public Car(Framework framework) {
......
}
//case 2:回傳值
public Framework run() {
return null;
}
//case 3:方法內變數
public void run() {
Framework framework;
}
}

這三種情況下類間關系是依賴,因為Framework類在Car類的生命周期中占了區域,對于類來說,方法是區域的,類本身是全域的,所以區域的關系一定比全域弱,所以在方法內部宣告的類變數,類間關系是依賴,簡單一句話總結:區分依賴與關聯關系就要看一個類在另一個類中生命周期的長短,
總結
以上對于UML的六種關系,都是經過小編根據代碼與圖對應實踐后得出的結論,如有不同觀點,歡迎交流,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/261422.html
標籤:其他
