泛化、實作、依賴和關聯的差別
傳統應用程式設計中所說的依賴一般指“類之間的關系”,那先讓我們複習一下類之間的關系:
a、實作
表示類對接口的實作。
UML圖中實作使用一條帶有空心三角箭頭的虛線指向接口,如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SMycDO2MGZxEGZmNmNwQzMzYzX5EzMzYTM4IzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
b、泛化
表示類與類之間的繼承關系、接口與接口之間的繼承關系。
UML圖中實作使用一條帶有空心三角箭頭的實線指向基類,如下:
c、依賴
表現為函數中的參數(use a),是類與類之間的連接配接,表示一個類依賴于另一個類的定義,其中一個類的變化将影響另外一個類。例如如果A依賴于B,則B展現為局部變量,方法的參數、或靜态方法的調用。如電視(TV)依賴于頻道(channel)常見的依賴關系如下:
(1)類B以參數的形式傳入類A的方法。
(2)類B以局部變量的形式存在于類A的方法中。
(3)類A調用類B的靜态方法。
UML圖中實作使用一條帶有箭頭的虛線指向被依賴的類,如下:
d、關聯
表現為變量(has a),類與類之間的聯接,它使一個類知道另一個類的屬性和方法。例如如果A依賴于B,則B展現為A的全局變量,如person類和company類。
關聯關系有雙向關聯和單向關聯:
1、雙向關聯:兩個類都知道另一個類的公共屬性和操作。
2、單向關聯:隻有一個類知道另外一個類的公共屬性和操作。
大多數關聯應該是單向的,單向關系更容易建立和維護,有助于尋找可服用的類。
UML圖中實作使用一條實線(有的地方用帶箭頭的實線)連接配接相同或不同類,如下:
e、聚合
是關聯關系的一種,是弱的關聯關系。聚合關系是整體和個體的關系。普通關聯關系的兩個類處于同一層次上,而聚合關系的兩個類處于不同的層次,一個是整體,一個是部分。同時,是一種弱的“擁有”關系。此時整體與部分之間是可分離的,他們可以具有各自的生命周期, 部分可以屬于多個整體對象,也可以為多個整體對象共享;比如計算機與CPU、公司與員工的關系等;表現在代碼層面,和關聯關系是一緻的,隻能從語義級别來區分。
UML圖中實作使用一條帶有虛心菱形的線來表示,如下:
f、組合
是關聯關系的一種,是比聚合關系強的關聯關系。它要求普通的聚合關系中代表整體的對象負責代表部分的對象的生命周期。Composition(組合關系)是一種強的“擁有”關系,展現了嚴格的部分和整體的關系,部分和整體的生命周期一緻。他同樣展現整體與部分間的關系,但此時整體與部分是不可分的,整體的生命周期結束也就意味着部分的生命周期結束;比如你和你的大腦,window視窗和frame,在視窗中建立一個frame時必須把它附加到視窗上,當視窗消失時frame也就消失了;表現在代碼層面,和關聯關系是一緻的,隻能從語義級别來區分;
UML圖中實作使用一條帶有實心菱形的線來表示
幾種關系所表現的強弱程度依次為:組合>聚合>關聯>依賴。
聚合群組合的差別:關系;聚合關系表示整體與部分的關系比較弱,而組合比較強;聚合關系中代表部分事物的對象與代表聚合事物的對象的生存期無關,一旦删除了聚合對象不一定就删除了代表部分事物的對象。組合中一旦删除了組合對象,同時也就删除了代表部分事物的對象。我們用淺顯的例子來說明聚合群組合的差別。“國破家亡”,國滅了,家自然也沒有了,“國”和“家”顯然也是組合關系。而相反的,計算機和它的外設之間就是聚合關系,因為它們之間的關系相對松散,計算機沒了,外設還可以獨立存在,還可以接在别的計算機上。在聚合關系中,部分可以獨立于聚合而存在,部分的所有權也可以由幾個聚合來共享,比如列印機就可以在辦公室内被廣大同僚共用
聚合群組合的差別則在語義和實作上都有差别,組合的兩個對象之間其生命期有很大的關聯,被組合的對象是在組合對象建立的同時或者建立之後建立,在組合對象銷毀之前銷毀。一般來說被組合對象不能脫離組合對象獨立存在,而且也隻能屬于一個組合對象,例如一個文檔的版本,必須依賴于文檔的存在,也隻能屬于一個文檔。聚合則不一樣,被聚合的對象可以屬于多個聚合對象,例如一個員工可能可以屬于多個公司
關聯和聚合的差別:
關聯和聚合的差別主要在語義上,關聯的兩個對象之間一般是平等的,例如你是我的朋友,聚合則一般不是平等的,例如一個公司包含了很多員工,其實作上是差不多的。