UML中類與類榨婆,已經(jīng)類與接口磁携,接口與接口的關(guān)系有:泛化(generalization),關(guān)聯(lián)(association)良风,依賴(dependency)谊迄,實現(xiàn)(realization)這幾種。
泛化(generalization)關(guān)系時指一個類(子類烟央、子接口)繼承另外一個類(稱為父類统诺、父接口)的功能,并可以增加它自己新功能的能力疑俭,繼承是類與類或者接口與接口最常見的關(guān)系粮呢,在Java中通過關(guān)鍵字extends來表示。
實現(xiàn)(realization)是指一個class實現(xiàn)interface接口(一個或者多個)钞艇,表示類具備了某種能力啄寡,實現(xiàn)是類與接口中最常見的關(guān)系,在Java中通過implements關(guān)鍵字來表示香璃。
依賴(dependency)關(guān)系也是表示類與類之間的連接这难,表示一個類依賴于另外一個類的定義,依賴關(guān)系時是單向的葡秒。簡單理解就是類A使用到了類B,這種依賴具有偶然性嵌溢、臨時性眯牧,是非常弱的關(guān)系。但是類B的變化會影響到類A赖草。舉個例子学少,如某人要過河,則人與船的關(guān)系就是依賴秧骑,人過河之后版确,與船的關(guān)系就解除了,因此是一種弱的連接乎折。在代碼層面绒疗,為類B作為參數(shù)被類A在某個方法中使用。
在java中骂澄,依賴表現(xiàn)為:局部變量吓蘑,方法中的參數(shù)和對靜態(tài)方法的調(diào)用。
關(guān)聯(lián)(association)關(guān)系表示類與類之間的連接,它使得一個類知道另外一個類的屬性和方法磨镶。
關(guān)聯(lián)可以使用單箭頭表示單向關(guān)聯(lián)溃蔫,使用雙箭頭或者不適用箭頭表示雙向關(guān)聯(lián),不建議使用雙向關(guān)聯(lián)琳猫,關(guān)聯(lián)有兩個端點伟叛,每個端點可以有一個基數(shù),表示這個關(guān)聯(lián)的類可以有幾個實例脐嫂。
0..1 表示可以有0個或者1個實例
0..* 表示對實例的數(shù)目沒有限制
1 ? ? 表示只能有一個實例
1..* 表示至少有一個實例
關(guān)聯(lián)關(guān)系體現(xiàn)的是兩個類统刮,或者類與接口之間的強依賴關(guān)系,這種關(guān)系很強烈雹锣,比依賴更強网沾,不是偶然性的,也不是臨時性的蕊爵,而是一種長期性辉哥,相對平等的關(guān)系,表現(xiàn)在代碼層面攒射,為被關(guān)聯(lián)的類B以類屬性的形式出現(xiàn)在類A中醋旦,也可能是關(guān)聯(lián)類A引用了被關(guān)聯(lián)類B的全局變量。
在Java中会放,關(guān)聯(lián)關(guān)系是使用實例變量來實現(xiàn)的
聚合(aggregation)是關(guān)聯(lián)關(guān)系的特例饲齐,是強的關(guān)聯(lián)關(guān)系,聚合是整個與個體的關(guān)系咧最,即has-a關(guān)系捂人,此時整體和部分是可以分離的,他們具有各自的生命周期矢沿,部分可以屬于多個對象滥搭,也可以被多個對象共享;比如計算機和CPU捣鲸,公司與員工的關(guān)系瑟匆;在代碼層面聚合與關(guān)聯(lián)是一致的,只能從語義上來區(qū)分栽惶。
聚合關(guān)系也是使用實例變量來實現(xiàn)的愁溜,在java語法上區(qū)分不出關(guān)聯(lián)和聚合,關(guān)聯(lián)關(guān)系中類出于一個層次外厂,而聚合則明顯的在兩個不同的層次冕象。
組合(compostion)也是關(guān)聯(lián)關(guān)系的一種特例,體現(xiàn)的是一種contain-a關(guān)系酣衷,比聚合更強交惯,是一種強聚合關(guān)系。它同樣體現(xiàn)整體與部分的關(guān)系,但此時整體與部分是不可分的席爽,整體生命周期的結(jié)束也意味著部分生命周期的結(jié)束意荤,反之亦然。如大腦和人類只锻。
體現(xiàn)在代碼層面與關(guān)聯(lián)時一致的玖像,只能從語義來區(qū)分。
組合與聚合幾乎完全相同齐饮,唯一區(qū)別就是對于組合捐寥,“部分”不同脫離“整體”單獨存在,其生命周期應該是一致的祖驱。
總結(jié):
主要是關(guān)聯(lián)關(guān)系的細化需要注意強弱握恳,由若到強分別是 依賴 < 關(guān)聯(lián) < 聚合 < 組合
參考: