-
泛化:(Generalization):
- 表示繼承關(guān)系, 表示類/接口對(duì)父類/接口的功能擴(kuò)展.
- java語(yǔ)法中的
extends
, 用來(lái)擴(kuò)展父類或父接口的功能. -
圖形表示: 帶三角箭頭的實(shí)線, 箭頭指向父類或父接口.
泛化關(guān)系.png - 代碼表示
class Child extends Parent {}
-
實(shí)現(xiàn)(Realization):
- 表示類實(shí)現(xiàn)接口定義的行為或功能.
- java語(yǔ)法中的
implements
. -
圖形表示:帶三角箭頭的虛線, 箭頭指向接口.
實(shí)現(xiàn)關(guān)系.png - 代碼表示
class Plane implements Flyable{ public void fly() {} }
-
依賴(Dependency):
表示使用關(guān)系, A需要B的協(xié)助來(lái)完成工作形成的關(guān)系, 但是這種使用關(guān)系具有臨時(shí)性的特點(diǎn). 比如, 廚師在烹飪的時(shí)候看了一眼菜譜, 廚師"使用"了菜譜, 照著它炒完菜后,這種使用關(guān)系就結(jié)束了(臨時(shí)性).
java的語(yǔ)法中, 被依賴的對(duì)象/類, 以方法參數(shù), 局部變量和靜態(tài)方法調(diào)用的形式出現(xiàn).
-
圖形表示: 因?yàn)橐蕾嚭捅灰蕾囮P(guān)系比較弱, 所以使用虛線+箭頭表示. 箭頭指向被依賴者.而且一般是單向關(guān)系.
依賴關(guān)系.png -
代碼表示
class Chef { public void check(Recipe r) { r.showProcedure(); } }
-
關(guān)聯(lián)(Association):
關(guān)聯(lián)關(guān)系,表示"擁有", 相比依賴關(guān)系的臨時(shí)性和單向性, 關(guān)聯(lián)關(guān)系具有長(zhǎng)期性, 平等性(可雙向),所以關(guān)聯(lián)表示的關(guān)系比依賴更強(qiáng). 比如現(xiàn)實(shí)生活中的夫妻, 師生等關(guān)系. 長(zhǎng)期存在并且是相互的關(guān)系. 此外關(guān)聯(lián)可以表示一對(duì)一,一對(duì)多, 多對(duì)一, 多對(duì)多等各種關(guān)系.
java語(yǔ)法中, 被擁有者作為擁有者的成員變量存在.
-
圖形表示: 因?yàn)楸纫蕾囮P(guān)系更強(qiáng), 所以是實(shí)線+箭頭.雙向關(guān)聯(lián)可以省略箭頭
關(guān)聯(lián)關(guān)系.PNG -
代碼表示:
class Husband { private Wife wife; private Address address; } class Wife { private Husband husband; }
后面兩種關(guān)系 "聚合
" 和 "組合
", 都屬于關(guān)聯(lián)關(guān)系, 用來(lái)表示關(guān)聯(lián)關(guān)系中整體與部分
的關(guān)系, 雖然各有特點(diǎn), 但既然都屬于關(guān)聯(lián)關(guān)系, 它們?cè)谡Z(yǔ)法上是沒(méi)有區(qū)別的, 都是用成員變量
表達(dá).
-
聚合(Aggregation):
- 表示"has-a"關(guān)系, 整體與部分的關(guān)系, 這種關(guān)系相對(duì)于
組合
弱一些, 整體與部分是可分離的. 比如, 部門與員工, 部門有許多員工, 員工離職了, 部門仍然存在,并不會(huì)受到影響, 部門解散了,員工可以去其他部門(整體與部分可分離) -
圖形表示: 空心菱形+實(shí)線+箭頭, 箭頭指向部分, 菱形指向整體.
聚合關(guān)系.png
- 表示"has-a"關(guān)系, 整體與部分的關(guān)系, 這種關(guān)系相對(duì)于
-
組合(Composition):
表示"contains-a"的關(guān)系. 是一種組裝的關(guān)系. 并且整體與部分是不可分離的. 比起
聚合
限制更強(qiáng)了. 這種關(guān)系中,整體與部分的生命周期是一致的, 這個(gè)限制是非常這嚴(yán)苛的, 以至于在現(xiàn)實(shí)中很難找到符合的示例.
?????????但是在程序中,反而很好實(shí)現(xiàn), 因?yàn)槲覀兛梢酝耆瓶貙?duì)象的生命周期. 所以這種關(guān)系并不是對(duì)現(xiàn)實(shí)世界中某類關(guān)系的抽象, 而是具體的, 戰(zhàn)術(shù)性的邏輯工具, 設(shè)計(jì)者使用它來(lái)表達(dá)類之間的這種強(qiáng)限制.
?????????例如, 在現(xiàn)實(shí)中, 人體和器官(整體和部分)的生命周期并不一致. 但設(shè)計(jì)的系統(tǒng)中并不支持器官移植之類的功能, 所以器官單獨(dú)出現(xiàn)在系統(tǒng)中就沒(méi)有意義, 使用組合可以明確表達(dá)這種目的.
?????????這也是組合唯一的目的,表示給整體與部分的關(guān)系加一層限制,而不是直接對(duì)問(wèn)題域中的關(guān)系建模. 操作上可以先識(shí)別聚合(整體與部分)關(guān)系. 然后判斷如果部分在整體的概念之外沒(méi)有存在的意義, 就可以確定為組合.
?????????而在具體實(shí)現(xiàn)上, 可以將部分完全作為整體的內(nèi)部狀態(tài), 比如私有的內(nèi)部類. 這種強(qiáng)限制關(guān)系使用比較少.-
圖形表示: 實(shí)心菱形+ 實(shí)線+ 箭頭, 菱形指向整體, 箭頭指向部分
組合關(guān)系.png
總結(jié)
繼承 | 實(shí)現(xiàn) | 依賴 | 關(guān)聯(lián) | 聚合 | 組合 | |
---|---|---|---|---|---|---|
關(guān)系含義 | 功能擴(kuò)展 | 功能實(shí)現(xiàn) | 使用 | 擁有 | 整體-部分(has-a) | 整體-部分(contains-a) |
關(guān)系特性 | - | - | 臨時(shí)性鸟蟹,單向性 | 長(zhǎng)期性,可雙向(平等性) | 整體與部分可分離 | 整體與部分不可分離咱旱,生命周期一致 |
java語(yǔ)法 | extends | implements | 方法參數(shù)扫夜,局部變量,靜態(tài)方法調(diào)用 | 成員變量 | 成員變量 | 成員變量 |
關(guān)系強(qiáng)弱 | 強(qiáng) | 強(qiáng) | 弱 | 較強(qiáng) | 較強(qiáng) | 非常強(qiáng) |
現(xiàn)實(shí)事例 | 父子 | 飛機(jī)/鳥可以飛 | 廚師使用菜譜仓蛆,裁判使用秒表 | 夫妻,師生 | 部門-員工 | - |
圖形表示 | ||||||
圖形指向 | 箭頭指向父類 | 箭頭指向接口 | 箭頭指向被使用者 | 指向被擁有者,可雙向 | 箭頭指向部分逾冬, 菱形指向整體 | 箭頭指向部分,菱形指向整體 |