合成 聚合復用原則CARP

2021-06-22 16:29:52 字數 1395 閱讀 6990

1、在乙個新的物件裡面使用一些已有的物件,使之成為新物件的一部分,新物件通過向這些物件的委派達到復用已有功能的目的。

在物件導向設計裡,不同環境中復用已有設計和實現的基本方法:

繼承、合成/聚合。

2、繼承復用:

通過擴充套件乙個已有物件的實現來得到新的功能,基類明顯地捕獲共同的屬性和方法,而子類通過增加新的屬性和方法來擴充套件超類的實現。繼承是型別的復用。

3、繼承復用的優點:

新的實現較為容易,因為超類的大部分功能可通過繼承關係自動進入子類;修改或擴充套件繼承而來的實現較為容易。

4、繼承復用的缺點:

繼承復用破壞封裝,因為繼承將超類的實現細節暴露給子類。「白箱」復用;如果超類的實現發生改變,那麼子類的實現也不得不發生改變。從超類繼承而來的實現是靜態的,不可能再執行時間內發生改變,因此沒有足夠的靈活性。

5、合成/聚合復用

由於合成/聚合可以將已有的物件納入到新物件中,使之成為新物件的一部分,因此新的物件可以呼叫已有物件的功能。

優點:新物件訪問成分物件的唯一方法是通過成分物件的介面;成分物件的內部細節對新物件不可見。 「黑箱」復用;該復用支援封裝。該復用所需的依賴較少。每乙個新的類可將焦點集中在乙個任務上。該復用可在執行時間內動態進行,新物件可動態引用於成分物件型別相同的物件。

缺點:通過這種復用建造的系統會有較多的物件需要管理。為了能將多個不同的物件作為組合塊(composition block)來使用,必須仔細地對介面進行定義。 要正確的選擇合成/復用和繼承,必須透徹地理解黎克特制替換原則和coad法則。

6、coad法則:

只有當以下coad條件全部被滿足時,才應當使用繼承關係:

子類是超類的乙個特殊種類,而不是超類的乙個角色。只有「is-a」關係才符合繼承關係,「has-a」關係應當用聚合來描述。 

永遠不會出現需要將子類換成另外乙個類的子類的情況。如果不能肯定將來是否會變成另外乙個子類的話,就不要使用繼承。 

子類具有擴充套件超類的責任,而不是具有置換掉(override)或登出掉(nullify)超類的責任。如果乙個子類需要大量的置換掉超類的行為,那麼這個類就不應該是這個超類的子類。 

7、只有在分類學角度上有意義時,才可以使用繼承。不要從工具類繼承。 

錯誤地使用繼承而不是合成/聚合的乙個常見原因是錯誤的把「has-a」當成了「is-a」。

「is-a」代表乙個類是另外乙個類的一種;

「has-a」代表乙個類是另外乙個類的乙個角色,而不是另外乙個類的特殊種類。 

8、黎克特制替換原則是繼承復用的基礎。只有兩個類滿足黎克特制替換原則的時候,才可能是「is-a」關係。

如果兩個類是「has-a」關係而非「is-a」關係,但是設計成了繼承,那麼肯定違反黎克特制替換原則。

9、總結:

基本法則是:優先使用物件組合,而非(類)繼承

要盡量使用合成/聚合,盡量不要使用繼承。

合成 聚合復用原則

一 合成 聚合復用原則 盡量使用合成 聚合,盡量不要使用類繼承 二 什麼是合成?合成表示一種強的擁有關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一樣,打個比方 人有兩個胳膊,胳膊和人就是部分和整體的關係,人去世了,那麼胳膊也就沒用了,也就是說胳膊和人的生命週期是相同的 合成關係用實心的菱...

設計模式六大原則 合成 聚合復用原則 CARP

簡而言之,對於合成 聚合復用原則的定義就是 要盡量使用合成和聚合,盡量不要使用繼承。為什麼 要盡量使用合成和聚合。盡量不要使用繼承 呢?這是由於 第一,繼承復用破壞包裝,它把父類的實現細節直接暴露給了子類,這違背了資訊隱藏的原則 第二 假設父類發生了改變。那麼子類也要發生對應的改變。這就直接導致了類...

設計模式之合成 聚合利用原則(CARP)

一 概念 carp compositionaggregation principle 合成聚合復用原則,盡量使用合成 聚合,盡量不使用類繼承。合成聚合是 has a 的關係,而繼承是 is a 的關係。由於繼承是一中強耦合的結構,父類變,子類必變。所以不是 is a 關係,我們一般不要用繼承。優先使...