原創文章,同步發自做者我的博客,http://www.jasongj.com/uml/class_diagram/數據庫
在UML 2.*的13種圖形中,類圖是使用頻率最高的UML圖之一。類圖用於描述系統中所包含的類以及它們之間的相互關係,幫助開發人員理解系統,它是系統分析和設計階段的重要產物,也是系統編碼和測試的重要模型依據。編程
在UML類圖中,類使用包含類名、屬性和方法且帶有分隔線的長方形來表示。如一個Employee類,它包含private屬性age,protected屬性name,public屬性email,package屬性gender,public方法work()。其UML類圖表示以下圖所示。
設計模式
UML規定類圖中屬性的表示方式爲編程語言
可見性 名稱 : 類型 [=缺省值]
方法表示形式爲測試
可見性 方法名 [參數名 : 參數類型] : 返回值類型
方法的多個參數間用逗號隔開,無返回值時,其類型爲void
編碼
+
表示-
表示#
表示~
表示接口的表示形式與類相似,區別在於接口名須以尖括號包裹,同時接口無屬性框,方法可見性只可能爲public
,這是由接口自己的特性決定的。設計
依賴關係是一種偶然的、較弱的使用關係,特定事物的改變可能影響到使用該事情的其它事物,在須要表示一個事物使用另外一個事物時使用依賴關係。代理
UML中使用帶箭頭的虛線表示類間的依賴(Dependency)關係,箭頭由依賴類指向被依賴類。下圖表示Dirver類依賴於Car類
code
關聯(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類圖中,類與接口間的實現關係用帶空心三角形的虛線表示。同時類中也須要列出接口中所聲明的全部方法(這一點與類間的繼承關係表示不一樣)。
聚合關係與組合關係都表示總體與部分的關係,有何區別?
聚合關係中,部分對象的生命週期獨立於總體對象的生命週期,或者總體對象消亡後部分對象仍然能夠獨立存在,同時在代碼中通常經過總體類的帶參構造方法或Setter方法將部分類對象傳入總體類的對象,UML中表示聚合關係的實線以空心菱形開始。
組合關係中,部分類對象的生命週期由總體對象控制,一旦總體對象消亡,部分類的對象隨即消亡。代碼中通常在總體類的構造方法內建立部分類的對象,UML中表示組合關係的實線以實心菱形開始。
同時在組合關係中,部分類的對象只屬於某一個肯定的總體類對象;而在聚合關係中,部分類對象能夠屬於一個或多個總體類對象。
如同《Java設計模式(六)代理模式 vs. 裝飾模式》一文中所述代理模式中,代理類的對象與被代理類的對象即爲組合關係。裝飾模式中,裝飾類的對象與被裝飾類的對象即爲聚合關係。
聚合關係、組合關係與關聯關係有何區別和聯繫?
聚合關係、組合關係和關聯關係實質上是對象間的關係(繼承和實現是類與類和類與接口間的關係)。從語意上講,關聯關係中兩種對象間通常是平等的,而聚合和組合則表明總體和部分間的關係。而聚合與組合的區別主要體如今實現上和生命週期的管理上。
依賴關係與關聯關係的區別是? 依賴關係是較弱的關係,通常表現爲在局部變量中使用被依賴類的對象、以被依賴類的對象做爲方法參數以及使用被依賴類的靜態方法。而關聯關係是相對較強的關係,通常表現爲一個類包含一個類型爲另一個類的屬性。