在UML 2.*的13種圖形中,類圖是使用頻率最高的UML圖之一,它表示了類與類之間的關係,幫助開發人員理解系統。它是系統分析和設計階段的重要產物,也是系統編碼和測試的重要模型依據。本文詳細介紹了類間的依賴關係,關聯關係(聚合、組合等),實現關係以及繼承關係的UML表示形式及其在代碼中的實現方式。 ...
原創文章,同步發自作者個人博客,http://www.jasongj.com/uml/class_diagram/
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 |
例如一個網頁可能沒有可點擊按鈕,也可能有多個按鈕,但是該頁面中的一個按鈕只屬於該頁面,其關聯多重性如下圖所示。
聚合關係
聚合(Aggregation)關係表示整體與部分的關係。在聚合關係中,部分對象是整體對象的一部分,但是部分對象可以脫離整體對象獨立存在,也即整體對象並不控制部分對象的生命周期。從代碼實現上來講,部分對象不由整體對象創建,一般通過整體類的帶參構造方法或者Setter方法或其它業務方法傳入到整體對象,並且有整體對象以外的對象持有部分對象的引用。
在UML類圖中,聚合關係由帶箭頭的實線表示,並且實線的起點處以空心菱形表示,如下圖所示。
《Java設計模式(六)代理模式 vs. 裝飾模式》一文中所述裝飾模式中,裝飾類的對象與被裝飾類的對象即為聚合關係。
組合關係
組合(Composition)關係也表示類之間整體和部分的關係,但是在組合關係中整體對象控製成員對象的生命周期,一旦整體對象不存在了,成員對象也即隨之消亡。
從代碼實現上看,一般在整體類的構造方法中直接實例化成員類,並且除整體類對象外,其它類的對象無法獲取該對象的引用。
在UML類圖中,組合關係的表示方式與聚合關係類似,區別在於實線以實心菱形表示。
《Java設計模式(六)代理模式 vs. 裝飾模式》一文中所述代理模式中,代理類的對象與被代理類的對象即為組合關係。
泛化關係/繼承關係
泛化(Generalization)關係,用於描述父類與子類之間的關係,父類又稱作超類或者其類,子類又稱為派生類。註意,父類和子類都可為抽象類或者具體類。
在Java中,我們使用面向對象的三大特性之一——繼承來實現泛化關係,具體來說會用到extends
關鍵字。
在UML類圖中,泛化關係用帶空心三角形(指向父類)的實線表示。並且子類中不需要標明其從父類繼承下來的屬性和方法,只須註明其新增的屬性和方法即可。
實現關係
很多面向對象編程語言(如Java)中都引入了介面的概念。介面與介面之間可以有類與類之間類似的繼承和依賴關係。同時介面與類之間還存在一種實現(Realization)關係,在這種關係中,類實現了介面中聲明的方法。
在UML類圖中,類與介面間的實現關係用帶空心三角形的虛線表示。同時類中也需要列出介面中所聲明的所有方法(這一點與類間的繼承關係表示不同)。
UML類圖十萬個為什麼
聚合關係與組合關係都表示整體與部分的關係,有何區別?
聚合關係中,部分對象的生命周期獨立於整體對象的生命周期,或者整體對象消亡後部分對象仍然可以獨立存在,同時在代碼中一般通過整體類的帶參構造方法或Setter方法將部分類對象傳入整體類的對象,UML中表示聚合關係的實線以空心菱形開始。
組合關係中,部分類對象的生命周期由整體對象控制,一旦整體對象消亡,部分類的對象隨即消亡。代碼中一般在整體類的構造方法內創建部分類的對象,UML中表示組合關係的實線以實心菱形開始。
同時在組合關係中,部分類的對象只屬於某一個確定的整體類對象;而在聚合關係中,部分類對象可以屬於一個或多個整體類對象。
如同《Java設計模式(六)代理模式 vs. 裝飾模式》一文中所述代理模式中,代理類的對象與被代理類的對象即為組合關係。裝飾模式中,裝飾類的對象與被裝飾類的對象即為聚合關係。
聚合關係、組合關係與關聯關係有何區別和聯繫?
聚合關係、組合關係和關聯關係實質上是對象間的關係(繼承和實現是類與類和類與介面間的關係)。從語意上講,關聯關係中兩種對象間一般是平等的,而聚合和組合則代表整體和部分間的關係。而聚合與組合的區別主要體現在實現上和生命周期的管理上。
依賴關係與關聯關係的區別是?
依賴關係是較弱的關係,一般表現為在局部變數中使用被依賴類的對象、以被依賴類的對象作為方法參數以及使用被依賴類的靜態方法。而關聯關係是相對較強的關係,一般表現為一個類包含一個類型為另外一個類的屬性。