設計原則(三)組合復用原則

2021-07-08 10:30:04 字數 1191 閱讀 1989

一、什麼是組合復用原則

組合復用原則也叫合成/聚合復用原則(carp),就是在乙個新的物件裡面使用一些已有的物件,使之成為新物件的一部分;新的物件通過向這些物件的委派達到復用已有功能的目的。

這個原則的簡短表述就是:要盡量使用組合,盡量不要使用繼承。

二、實現復用的兩種方式

在物件導向的設計裡,有兩種基本的方法可以在不同的環境中復用已有的設計和實現,即通過組合或通過繼承。

組合

由於組合可以將已有的物件納入到新物件中,使之成為新物件的一部分,因此新物件可以呼叫已有物件的功能,這樣做有下面的好處:

組合復用的缺點就是用組合復用建造的系統會有較多的物件需要管理。

繼承

組合幾乎可以用到任何環境中去,但是繼承只能用到一些環境中。

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

繼承的優點:

新的實現比較容易,因為基類的大部分功能都可以通過繼承自動的進入子類。

修改或擴充套件繼承而來的實現較為容易。

繼承的缺點:

三、使用組合還是繼承

按照組合復用原則我們應該首選組合,然後才是繼承,使用繼承時應該嚴格的遵守黎克特制替換原則,必須滿足「is-a」的關係是才能使用繼承,而組合卻是一種「has-a」的關係。導致錯誤的使用繼承而不是使用組合的乙個重要原因可能就是錯誤的把「has-a」當成了「is-a」。

下面看乙個例子:

人被繼承到雇員,學生,經理子類。而實際上,雇員、學生和經理分別描述一種角色,而人可以同時有幾種不同的角色。比如,乙個人既然是經理了就一定是雇員,使用繼承來實現角色,則只能使用每乙個人具有一種角色,這顯然是不合理的。錯誤的原因就是把角色的等級結構和人的等級結構混淆起來,把has-a的關係誤認為是is-a的關係,通過下面的改正就可以正確的做到這一點。

從上圖可以看出,每乙個人都可以有乙個以上的角色,所以乙個人可以同時是雇員又是經理。從這個例子可以看出,當乙個類是另乙個類的角色時,不應該使用繼承描述這種關係。

設計模式原則21 組合模式

將物件組合成樹形結構以表示 部分 整體 的層次結構,使得使用者對單個物件和組合物件的使用具有一致性。1 component 抽象構件角色 定義參加組合物件的共有方法和屬性,可以定義一些預設的行為或屬性。2 leaf 葉子構件 葉子物件,其下再也沒有其他的分支,也就是遍歷的最小單位。3 composi...

設計模式 組合 聚合復用原則

合成 聚合復用原則 合成 聚合復用原則 composition aggregation principle carp 盡量使用合成 聚合,不要使用類繼承。即在乙個新的物件裡面使用一些已有的物件,使之成為新物件的一部分,新物件通過向這些物件的委派達到復用已有功能的目的。就是說要盡量的使用合成和聚合,而...

原則4 聚組復用原則

前一陣子參與乙個專案,對某產品第乙個版本的 進行了重構,原因是專案工期緊,要求第乙個版本以最短的時間拿出來,導致產品在部分需求未確定的情況下草草開始,匆匆結束。專案要求有大概五六個子系統,每個子系統間必須使用socket通訊,考慮到資料安全性和具體協議的不確定性,商議新版 通訊暫時使用tcp協議進行...