我們平常要使用UML工具畫類之間的關系,因此經常會見到依賴、關聯、泛化、繼承、實現、聚合、組合等概念,那么他們是怎么樣的,區別在哪里呢?我在這里整理一下:
依賴是指類A要完成一定的功能,必須要類B的幫助,例如使用到類B的方法,而類A和類B之間并沒有比較親密的聯系,只是要利用B而已,他們之間的關系是偶 然的,臨時性的,比較脆弱,體現在代碼形式上:類B只需作為類A的方法參數,或者類A直接使用類B的靜態方法,而類B不會形成類A的屬性 。
在UML類圖關系表示上: 虛線+箭頭指向被依賴方,依賴關系好的實踐是單向依賴,壞的實踐的相互依賴,,千萬不要出現雙向依賴。
關聯是指類A和類B之間存在比較強的關系,與依賴相比,這種關系不是偶然性的,例如人和人的常用住址,就是一種比較強的關系,不是臨時的,是長期的,體現在代碼層面:類B作為類A的一個屬性存在,體現出他們的關系比較緊密。
在UML類圖關系上: 實線+箭頭指向被關聯方,關聯關系可以是雙向,即A和B相互為對方的一個屬性。 至于到底是用依賴還是關聯關系,主要是看類之間關系的強弱,這個需要在一定的語境中來確定。
泛化關系其實就是繼承關系,包括接口繼承和類繼承,這個比較好理解。
在UML關系圖上表現: 實線+空心三角箭頭指向被繼承的基類或接口
實現關系也很好理解,類實現了一個接口。
UML關系圖如下: 虛線+空心三角箭頭指向被實現接口
聚合是關聯的一種特例,語義上表示整體和個體 概念,表示has-a關系,整體和個體是可以分離的,整體和個體生命周期是獨立的,例如,公司和員工,社團和成員,成員可以屬于多個不同的整體,在代碼層面上,聚合與關聯是一樣的,因此只能從語義上來區分。 在UML類圖關系如下:
組合也是關聯的一種特例,語義上表示主體和部分 概念,表示contains-a關系,整體和部分是不可以分離的,他們的生命周期是關聯在一起的,主體滅亡,部分也隨著滅亡,代碼層面上,組合關系與聚合和關聯都是一樣的,因此也只能從語義上進行區分。
可見,其實這幾個區別還是比較明顯的,他們之間的關系基本都體現在語義關系上,代碼 上的實現可能基本類似,不過有一點,有了語義上的區分,那么在代碼層面上盡量體現出語義來,也是一個比較好的做法,例如,代碼中最好不要帶著hand對象 單獨到處跑,應該跟著person才是最好的選擇。 |
|