轉(zhuǎn)自:https://www.cnblogs.com/jiyuqi/p/4571543.html
UML中類與類柳譬,類與接口续镇,接口與接口的關(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在某個方法中使用
關(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ū)別就是對于組合割以,“部分”不能脫離“整體”單獨存在猜极,其生命周期應(yīng)該是一致的
總結(jié):
主要是關(guān)聯(lián)關(guān)系的細化需要注意強弱莱找,由若到強分別是 依賴 < 關(guān)聯(lián) < 聚合 < 組合