六大UML類(lèi)圖關(guān)系連連看
在學(xué)習(xí)UML類(lèi)圖的過(guò)程中,UML類(lèi)圖關(guān)系是必須要掌握的問(wèn)題,UML定義的關(guān)系主要有六種:依賴(lài)、類(lèi)屬、關(guān)聯(lián)、實(shí)現(xiàn)、聚合和組合。下面對(duì)其定義和表示方法逐一說(shuō)明。
UML類(lèi)圖關(guān)系簡(jiǎn)介
依賴(lài)(Dependency):元素A的變化會(huì)影響元素B,但反之不成立,那么B和A的關(guān)系是依賴(lài)關(guān)系,B依賴(lài)A;類(lèi)屬關(guān)系和實(shí)現(xiàn)關(guān)系在語(yǔ)義上講也是依賴(lài)關(guān)系,但由于其有更特殊的用途,所以被單獨(dú)描述。UML中用帶箭頭的虛線(xiàn)表示Dependency關(guān)系,箭頭指向被依賴(lài)元素。
類(lèi)屬(Generalization):通常所說(shuō)的繼承(特殊個(gè)體iskindof一般個(gè)體)關(guān)系,不必多解釋了。UML中用帶空心箭頭的實(shí)線(xiàn)線(xiàn)表示Generalization關(guān)系,箭頭指向一般個(gè)體。
實(shí)現(xiàn)(Realize):元素A定義一個(gè)約定,元素B實(shí)現(xiàn)這個(gè)約定,則B和A的關(guān)系是Realize,BrealizeA。這個(gè)關(guān)系最常用于接口。UML中用空心空心箭頭和虛線(xiàn)表示Realize關(guān)系,箭頭指向定義約定的元素。
關(guān)聯(lián)(Association):元素間的結(jié)構(gòu)化關(guān)系,是一種弱關(guān)系,被關(guān)聯(lián)的元素間通常可以被獨(dú)立的考慮。UML中用實(shí)線(xiàn)表示Dependency關(guān)系,箭頭指向被依賴(lài)元素。
聚合(Aggregation):關(guān)聯(lián)關(guān)系的一種特例,表示部分和整體(整體hasa部分)的關(guān)系。UML中用帶空心菱形頭的實(shí)線(xiàn)表示Aggregation關(guān)系,菱形頭指向整體。
組合(Composition):組合是聚合關(guān)系的變種,表示元素間更強(qiáng)的組合關(guān)系。如果是組合關(guān)系,如果整體被破壞則個(gè)體一定會(huì)被破壞,而聚合的個(gè)體則可能是被多個(gè)整體所共享的,不一定會(huì)隨著某個(gè)整體的破壞而被破壞。UML中用帶實(shí)心心菱形頭的實(shí)線(xiàn)表示Composition關(guān)系,菱形頭指向整體。
UML類(lèi)圖關(guān)系詳解
后面的例子將針對(duì)某個(gè)具體目的來(lái)獨(dú)立地展示各種關(guān)系。雖然語(yǔ)法無(wú)誤,但這些例子可進(jìn)一步精煉,在它們的有效范圍內(nèi)包括更多的語(yǔ)義。
依賴(lài)(Dependency)
實(shí)體之間一個(gè)“使用”關(guān)系暗示一個(gè)實(shí)體的規(guī)范發(fā)生變化后,可能影響依賴(lài)于它的其他實(shí)例(圖D)。更具體地說(shuō),它可轉(zhuǎn)換為對(duì)不在實(shí)例作用域內(nèi)的一個(gè)類(lèi)或?qū)ο蟮娜魏晤?lèi)型的引用。其中包括一個(gè)局部變量,對(duì)通過(guò)方法調(diào)用而獲得的一個(gè)對(duì)象的引用(如下例所示),或者對(duì)一個(gè)類(lèi)的靜態(tài)方法的引用(同時(shí)不存在那個(gè)類(lèi)的一個(gè)實(shí)例)。也可利用“依賴(lài)”來(lái)表示包和包之間的關(guān)系。由于包中含有類(lèi),所以你可根據(jù)那些包中的各個(gè)類(lèi)之間的關(guān)系,表示出包和包的關(guān)系。
圖D
關(guān)聯(lián)(Association)
UML類(lèi)圖關(guān)系中實(shí)體之間的一個(gè)結(jié)構(gòu)化關(guān)系表明對(duì)象是相互連接的。箭頭是可選的,它用于指定導(dǎo)航能力。如果沒(méi)有箭頭,暗示是一種雙向的導(dǎo)航能力。在Java中,關(guān)聯(lián)(圖E)轉(zhuǎn)換為一個(gè)實(shí)例作用域的變量,就像圖E的“Java”區(qū)域所展示的代碼那樣。可為一個(gè)關(guān)聯(lián)附加其他修飾符。多重性(Multiplicity)修飾符暗示著實(shí)例之間的關(guān)系。在示范代碼中,Employee可以有0個(gè)或更多的TimeCard對(duì)象。但是,每個(gè)TimeCard只從屬于單獨(dú)一個(gè)Employee。
圖E
聚合(Aggregation)
聚合(圖F)是關(guān)聯(lián)的一種形式,代表兩個(gè)類(lèi)之間的整體/局部關(guān)系。聚合暗示著整體在概念上處于比局部更高的一個(gè)級(jí)別,而關(guān)聯(lián)暗示兩個(gè)類(lèi)在概念上位于相同的級(jí)別。聚合也轉(zhuǎn)換成Java中的一個(gè)實(shí)例作用域變量。#p#
關(guān)聯(lián)和聚合的區(qū)別純粹是概念上的,而且嚴(yán)格反映在語(yǔ)義上。聚合還暗示著實(shí)例圖中不存在回路。換言之,只能是一種單向關(guān)系。
圖F
合成(Composition)
UML類(lèi)圖關(guān)系中合成(圖G)是聚合的一種特殊形式,暗示“局部”在“整體”內(nèi)部的生存期職責(zé)。合成也是非共享的。所以,雖然局部不一定要隨整體的銷(xiāo)毀而被銷(xiāo)毀,但整體要么負(fù)責(zé)保持局部的存活狀態(tài),要么負(fù)責(zé)將其銷(xiāo)毀。局部不可與其他整體共享。但是,整體可將所有權(quán)轉(zhuǎn)交給另一個(gè)對(duì)象,后者隨即將承擔(dān)生存期職責(zé)。
Employee和TimeCard的關(guān)系或許更適合表示成“合成”,而不是表示成“關(guān)聯(lián)”。
圖G
泛化(Generalization)
UML類(lèi)圖關(guān)系中泛化(圖H)表示一個(gè)更泛化的元素和一個(gè)更具體的元素之間的關(guān)系。泛化是用于對(duì)繼承進(jìn)行建模的UML元素。在Java中,用extends關(guān)鍵字來(lái)直接表示這種關(guān)系。
圖H
實(shí)現(xiàn)(Realization)
實(shí)例(圖I)關(guān)系指定兩個(gè)實(shí)體之間的一個(gè)合同。換言之,一個(gè)實(shí)體定義一個(gè)合同,而另一個(gè)實(shí)體保證履行該合同。對(duì)Java應(yīng)用程序進(jìn)行建模時(shí),實(shí)現(xiàn)關(guān)系可直接用implements關(guān)鍵字來(lái)表示。
圖I
讀后感:通過(guò)java代碼和UML可以很清楚的理解這幾種關(guān)系,關(guān)聯(lián)分3種這比較搞,主要還是要搞清楚依賴(lài),關(guān)聯(lián),泛化和實(shí)現(xiàn)這4種關(guān)系
【編輯推薦】