合成/聚合復用原則
合成/聚合復用原則(composition/aggregation
principle carp),盡量使用合成/聚合,不要使用類繼承。即在乙個新的物件裡面使用一些已有的物件,使之成為新物件的一部分,新物件通過向這些物件的委派達到復用已有功能的目的。
就是說要盡量的使用合成和聚合,而不是繼承關係達到復用的目的。
如我們所知,在物件導向設計裡,不同環境中復用已有設計和實現的基本方法:
繼承。合成/聚合。
繼承復用通過擴充套件乙個已有物件的實現來得到新的功能,基類明顯地捕獲共同的屬性和方法,而子類通過增加新的屬性和方法來擴充套件超類的實現。繼承是型別的復用。
繼承復用的優點:
繼承復用的缺點:
合成(composition,也有翻譯成組合)和聚合(aggregation),都是關聯的特殊種類。聚合表示一種弱的「擁有」關係,體現的是a物件可以包含b物件,但b物件不是a物件的一部分;合成(組合)是一種強的「擁有」關係,體現了嚴格的部分與整體的關係,部分和整體的生命週期是一樣的。
由於合成/聚合可以將已有的物件納入到新物件中,使之成為新物件的一部分,因此新的物件可以呼叫已有物件的功能,
其優點在於:
缺點:
就是說要盡量的使用合成和聚合,而不是繼承關係達到復用的目的。其實這裡最終要的地方就是區分「has-a」
和「is-a」
的區別。相對於合成和聚合,繼承的缺點在於:父類的方法全部暴露給子類。父類如果發生變化,子類也得發生變化。聚合的復用的時候就對另外的類依賴的比較的少。
要正確的選擇合成/復用和繼承,必須透徹地理解黎克特制替換原則和coad法則。
coad法則由peter coad提出,總結了一些什麼時候使用繼承作為復用工具的條件。
coad法則:
只有當以下coad條件全部被滿足時,才應當使用繼承關係:
子類是超類的乙個特殊種類,而不是超類的乙個角色。區分「has-a」和「is-a」。只有「is-a」關係才符合繼承關係,「has-a」關係應當用聚合來描述。
永遠不會出現需要將子類換成另外乙個類的子類的情況。如果不能肯定將來是否會變成另外乙個子類的話,就不要使用繼承。
子類具有擴充套件超類的責任,而不是具有置換掉(override)或登出掉(nullify)超類的責任。如果乙個子類需要大量的置換掉超類的行為,那麼這個類就不應該是這個超類的子類。
只有在分類學角度上有意義時,才可以使用繼承。不要從工具類繼承。
錯誤地使用繼承而不是合成/聚合的乙個常見原因是錯誤的把「has-a」當成了「is-a」。
「is-a」代表乙個類是另外乙個類的一種;
「has-a」代表乙個類是另外乙個類的乙個角色,而不是另外乙個類的特殊種類。
設計模式原則 合成 聚合復用原則(四)
閱讀目錄 一 合成 聚合復用原則 二 什麼是合成?三 什麼是聚合?四 為什麼盡量不要使用類繼承而使用合成 聚合?五 合成 聚合復用原則結構圖 一 合成 聚合復用原則 盡量使用合成 聚合,盡量不要使用類繼承 二 什麼是合成?合成表示一種強的擁有關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一...
大話設計模式筆記 合成 聚合復用原則
合成 聚合復用原則,盡量使用合成 聚合,盡量不要使用類繼承。聚合 aggregation 表示一種弱的 擁有 關係,體現的是a物件可以包含b物件但b物件不是a物件的一部分。合成 composition 則是一種強的 擁有 關係,體現了嚴格的部分和整體關係,部分和整體的生命週期一樣。優先使用物件的合成...
合成 聚合復用原則
一 合成 聚合復用原則 盡量使用合成 聚合,盡量不要使用類繼承 二 什麼是合成?合成表示一種強的擁有關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一樣,打個比方 人有兩個胳膊,胳膊和人就是部分和整體的關係,人去世了,那麼胳膊也就沒用了,也就是說胳膊和人的生命週期是相同的 合成關係用實心的菱...