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