UML(一) 類圖及類間關係
UML類圖
UML類圖介紹
在UML 2.*的13種圖形中,類圖是使用頻率最高的UML圖之一。類圖用於描述系統中所包含的類以及它們之間的相互關係,幫助開發人員理解系統,它是系統分析和設計階段的重要產物,也是系統編碼和測試的重要模型依據。
類的UML圖示
在UML類圖中,類使用包含類名、屬性和方法且帶有分隔線的長方形來表示。如一個Employee類,它包含private屬性age,protected屬性name,public屬性email,package屬性gender,public方法work()。其UML類圖表示如下圖所示。
屬性及方法表示形式
UML規定類圖中屬性的表示方式為
可見性 名稱 : 型別 [=預設值]
方法表示形式為
可見性 方法名 [引數名 : 引數型別] : 返回值型別
方法的多個引數間用逗號隔開,無返回值時,其型別為void
屬性及方法可見性
- public 用
+
表示 - private 用
-
表示 - protected 用
#
表示 - package 用
~
表示
介面的UML圖示
介面的表示形式與類類似,區別在於介面名須以尖括號包裹,同時介面無屬性框,方法可見性只可能為public
,這是由介面本身的特性決定的。
類間關係
依賴關係
依賴關係說明
依賴關係是一種偶然的、較弱的使用關係,特定事物的改變可能影響到使用該事情的其它事物,在需要表示一個事物使用另一個事物時使用依賴關係。
依賴關係UML表示
UML中使用帶箭頭的虛線表示類間的依賴(Dependency)關係,箭頭由依賴類指向被依賴類。下圖表示Dirver類依賴於Car類
依賴關係的表現形式
- B類的例項作為A類方法的引數
- B類的例項作為A類方法的區域性變數
- A類呼叫B類的靜態方法
關聯關係
關聯(Association)關係是一種結構化關係,用於表示一類物件與另一類物件之間的聯絡。在Java中實現關聯關係時,通常將一個類的物件作為另一個類的成員變數。
在UML類圖中,用實線連線有關聯關係的類,並可在關聯線上標註角色名或關係名。
在UML中,關聯關係包含如下四種形式
雙向關聯
預設情況下,關聯是雙向的。例如資料庫管理員(DBA)管理資料庫(DB),同時每個資料庫都被某位管理員管理。因此,DBA和DB之間具有雙向關聯關係,如下圖所示。
從上圖可看出,雙向關聯的類的例項,互相持有對方的例項,並且可在關聯線上註明二者的關係,必須同時註明兩種關係(如上圖中的manage和managed by)。
單向關聯
單向關聯用帶箭頭的實線表示,同時一方持有另一方的例項,並且由於是單向關聯,如果在關聯線上註明關係,則只可註明單向的關係,如下圖所示。
自關聯
自關聯是指屬性型別為該類本身。例如在連結串列中,每個節點持有下一個節點的例項,如下圖所示。
多重性關聯
多重性(Multiplicity)關聯關係,表示兩個物件在數量上的對應關係。在UML類圖中,物件間的多重性可在關聯線上用一個數字或數字範圍表示。常見的多重性表示方式如下表所示。
表示方式 | 多重性說明 |
---|---|
1..1 | 另一個類的一個物件只與該類的一個物件有關係 |
0..* | 另一個類的一個物件只與該類的零個或多個物件有關係 |
1..* | 另一個類的一個物件與該類的一個或多個物件有關係 |
0..1 | 另一個類的一個物件與該類的物件沒關係或者只與該類的一個物件有關係 |
m..n | 另一個類的一個物件與該類最少m,最多n個物件有關係 |
例如一個網頁可能沒有可點選按鈕,也可能有多個按鈕,但是該頁面中的一個按鈕只屬於該頁面,其關聯多重性如下圖所示。
聚合關係
聚合(Aggregation)關係表示整體與部分的關係。在聚合關係中,部分物件是整體物件的一部分,但是部分物件可以脫離整體物件獨立存在,也即整體物件並不控制部分物件的生命週期。從程式碼實現上來講,部分物件不由整體物件建立,一般通過整體類的帶參構造方法或者Setter方法或其它業務方法傳入到整體物件,並且有整體物件以外的物件持有部分物件的引用。
在UML類圖中,聚合關係由帶箭頭的實線表示,並且實線的起點處以空心菱形表示,如下圖所示。
《Java設計模式(六)代理模式 vs. 裝飾模式》一文中所述裝飾模式中,裝飾類的物件與被裝飾類的物件即為聚合關係。
組合關係
組合(Composition)關係也表示類之間整體和部分的關係,但是在組合關係中整體物件控制成員物件的生命週期,一旦整體物件不存在了,成員物件也即隨之消亡。
從程式碼實現上看,一般在整體類的構造方法中直接例項化成員類,並且除整體類物件外,其它類的物件無法獲取該物件的引用。
在UML類圖中,組合關係的表示方式與聚合關係類似,區別在於實線以實心菱形表示。
《Java設計模式(六)代理模式 vs. 裝飾模式》一文中所述代理模式中,代理類的物件與被代理類的物件即為組合關係。
泛化關係/繼承關係
泛化(Generalization)關係,用於描述父類與子類之間的關係,父類又稱作超類或者其類,子類又稱為派生類。注意,父類和子類都可為抽象類或者具體類。
在Java中,我們使用面向物件的三大特性之一——繼承來實現泛化關係,具體來說會用到extends
關鍵字。
在UML類圖中,泛化關係用帶空心三角形(指向父類)的實線表示。並且子類中不需要標明其從父類繼承下來的屬性和方法,只須註明其新增的屬性和方法即可。
實現關係
很多面向物件程式語言(如Java)中都引入了介面的概念。介面與介面之間可以有類與類之間類似的繼承和依賴關係。同時介面與類之間還存在一種實現(Realization)關係,在這種關係中,類實現了介面中宣告的方法。
在UML類圖中,類與介面間的實現關係用帶空心三角形的虛線表示。同時類中也需要列出介面中所宣告的所有方法(這一點與類間的繼承關係表示不同)。
UML類圖十萬個為什麼
聚合關係與組合關係都表示整體與部分的關係,有何區別?
聚合關係中,部分物件的生命週期獨立於整體物件的生命週期,或者整體物件消亡後部分物件仍然可以獨立存在,同時在程式碼中一般通過整體類的帶參構造方法或Setter方法將部分類物件傳入整體類的物件,UML中表示聚合關係的實線以空心菱形開始。
組合關係中,部分類物件的生命週期由整體物件控制,一旦整體物件消亡,部分類的物件隨即消亡。程式碼中一般在整體類的構造方法內建立部分類的物件,UML中表示組合關係的實線以實心菱形開始。
同時在組合關係中,部分類的物件只屬於某一個確定的整體類物件;而在聚合關係中,部分類物件可以屬於一個或多個整體類物件。
如同《Java設計模式(六)代理模式 vs. 裝飾模式》一文中所述代理模式中,代理類的物件與被代理類的物件即為組合關係。裝飾模式中,裝飾類的物件與被裝飾類的物件即為聚合關係。
聚合關係、組合關係與關聯關係有何區別和聯絡?
聚合關係、組合關係和關聯關係實質上是物件間的關係(繼承和實現是類與類和類與介面間的關係)。從語意上講,關聯關係中兩種物件間一般是平等的,而聚合和組合則代表整體和部分間的關係。而聚合與組合的區別主要體現在實現上和生命週期的管理上。
依賴關係與關聯關係的區別是?
依賴關係是較弱的關係,一般表現為在區域性變數中使用被依賴類的物件、以被依賴類的物件作為方法引數以及使用被依賴類的靜態方法。而關聯關係是相對較強的關係,一般表現為一個類包含一個型別為另外一個類的屬性。