【重學UML】UML類圖關係及其對應代碼

寫在前面
大家好,我是Think-Coder,比較通俗的暱稱,寓意是做一個有思考的程序猿,現在的狀態是邊做項目邊學習;

博客是我平時做項目和學習的過程,很基礎,但是每一篇我很認真在寫,力求讓讀者,讀的清楚,看的明白。

不是大佬,但努力成爲,如果您也對Java、算法感興趣,可以相互關注,一起成長,相信滴水穿石的力量

一、UML類圖關係總覽

在這裏插入圖片描述
文字解釋下各個類及關係

含義及關係
Food類 食物類,People類依賴Food類
Adress類 地址類,People類關聯Address類
PeopleGroup類 人羣類,PeopleGroup類聚合People類
Heart類 心臟類,Hear類組合成People類
Animal類 動物類,People類繼承Animal類
Eatting接口 People類實現此接口

下面依關係耦合度角度,從低向高依次介紹並給出對象的代碼

二、依賴關係

1.關係描述

定義

  • 類之間的使用關係,即Use a,一個類使用了另一個類,或者一個類依賴另一個類的服務

對應java代碼

  • 類A依賴於類B,類B可以作爲類A方法的參數、局部變量、方法返回值類型
  • 或者類A方法中調用類B的靜態方法
2.舉例

UML圖
在這裏插入圖片描述
對應的代碼

Class People{
	//Food類作爲eat方法的參數
	public void eat(Food food){
		System.out.println("正在喫的食物是"+food.getName())
	}
}

People類想要完成eat方法,需要使用Food類,即需要Food類提供getName方法作爲服務

三、關聯關係

1.關係描述

定義

  • 表示類擁有另一個類,可以表示爲has a

對應java代碼

  • 類A關聯類B,類B作爲類A的成員變量
2.舉例

在這裏插入圖片描述
每一個People對象都有一個聯繫地址
對應代碼

Class People{
	//Address類作爲成員變量
	private Address address;
}
3.思考

爲什麼依賴比關聯的耦合度低?

依賴對應對象方法的局部變量,關聯對應對象的成員變量。
成員變量和對象具有相同的生命週期,即類A一直和類B存在關聯關係
局部變量只有在方法被調用時,類A纔會和類B存在依賴關係
因此從關係存在的時間長短可以推斷出依賴比關聯耦合度低

三、聚合、組合關係——關聯關係的兩種形式

1.關係描述

聚合

  • 描述兩個類之間存在“整體—部分”關係,部分類生命週期取決於本身,比關聯關係耦合度高

組合

  • 是聚合的特殊情況,也是"整體—部分"關係,部分類生命週期取決於整體,比聚合耦合度高
2.兩者關係對比

在這裏插入圖片描述

3.關係比較

共同點

  • "部分"類作爲"整體"類的成員變量,聚合中也可以是"部分"類型的數組

不同點:構造函數不同

  • 聚合:"整體"類包含"部分"類作爲參數,PeopleGroup類的構造函數要用到People類型的參數,People類可以脫離PeopleGroup類獨立存在,即部分可以脫離整體獨立存在
  • 組合:"整體"類包含"部分"類的實例化,在People類實例化之前一定要先實例化Heart(心臟)類,Heart類不可以脫離People類獨立存在,即部分不能獨立存在

四、繼承(泛化)關係

1.關係描述

子類繼承父類的屬性和方法,除私有成員和構造函數外
關係描述爲is a,比如人是一個動物

關於私有成員是否可以繼承,java官方文檔說是不可以
Private Members in a Superclass
A subclass does not inherit the private members of its parent class. However, if the superclass has public or protected methods for accessing its private fields, these can also be used by the subclass.

子類繼承父類,父類泛化子類,繼承對應java代碼使用extends關鍵字

2.舉例

在這裏插入圖片描述
對應代碼

class People extends Animal{
}
3.思考:合成(聚合)複用原則由來

此原則本質便爲:爲什麼少用繼承關係多用組合(合成)聚合關係
以下參考這篇大佬的博客

1.子類繼承父類公有和受保護的所有方法,即使父類方法是有害或者對子類無用

2. 耦合度高,父類變化也會引起子類變化,也可能造成類體系無限膨脹

3. 繼承的子類,實際上需要編譯期確定下來,這滿足不了需要在運行內才能確定對象的情況。而組合卻可以比繼承靈活得多,可以在運行期才決定某個對象。
對這句話理解:子類要想實例化其父類必先實例化,因此要實例的對象在編譯時已經確定,不能夠動態生成指定對象

組合聚合關係是結構型設計模式的核心,典型的設計模式有代理模式,適配器模式,裝飾模式,

五、實現關係

關係描述及舉例

  • 類實現接口,實現與泛化關係耦合度相同,下面看例子
  • 如People類實現了Eating接口,並重寫了eat方法
    在這裏插入圖片描述

對應代碼

class People implements Eating(){
	//重寫的方法,接口的方法就不寫了,哈哈
	public void eat(Food food){
		System.out.println("正在喫的食物是"+food.getName())
	}
}

六、最後總結

在這裏插入圖片描述
關係耦合度:繼承(泛化)=實現>組合>聚合>關聯>依賴

絮叨一句:過了一年又重學了一次UML,其實在軟考的時候就想寫了,只不過還不成體系,現在對面向對象的理解漸漸深入,這就是一個進步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章