天天看點

合成複用原則——面向對象設計原則

合成複用原則的定義

合成複用原則(Composite Reuse Principle,CRP)又叫組合/聚合複用原則(Composition/Aggregate Reuse Principle,CARP)。它要求在軟體複用時,要盡量先使用組合或者聚合等關聯關系來實作,其次才考慮使用繼承關系來實作。

如果要使用繼承關系,則必須嚴格遵循裡氏替換原則。合成複用原則同裡氏替換原則相輔相成的,兩者都是開閉原則的具體實作規範。

合成複用原則的重要性

通常類的複用分為繼承複用和合成複用兩種,繼承複用雖然有簡單和易實作的優點,但它也存在以下缺點。

  1. 繼承複用破壞了類的封裝性。因為繼承會将父類的實作細節暴露給子類,父類對子類是透明的,是以這種複用又稱為“白箱”複用。
  2. 子類與父類的耦合度高。父類的實作的任何改變都會導緻子類的實作發生變化,這不利于類的擴充與維護。
  3. 它限制了複用的靈活性。從父類繼承而來的實作是靜态的,在編譯時已經定義,是以在運作時不可能發生變化。

采用組合或聚合複用時,可以将已有對象納入新對象中,使之成為新對象的一部分,新對象可以調用已有對象的功能,它有以下優點。

  1. 它維持了類的封裝性。因為成分對象的内部細節是新對象看不見的,是以這種複用又稱為“黑箱”複用。
  2. 新舊類之間的耦合度低。這種複用所需的依賴較少,新對象存取成分對象的唯一方法是通過成分對象的接口。
  3. 複用的靈活性高。這種複用可以在運作時動态進行,新對象可以動态地引用與成分對象類型相同的對象。

合成複用原則的實作方法

合成複用原則是通過将已有的對象納入新對象中,作為新對象的成員對象來實作的,新對象可以調用已有對象的功能,進而達到複用。

下面以汽車分類管理程式為例來介紹合成複用原則的應用。

【例1】汽車分類管理程式。

分析:汽車按“動力源”劃分可分為汽油汽車、電動汽車等;按“顔色”劃分可分為白色汽車、黑色汽車和紅色汽車等。如果同時考慮這兩種分類,其組合就很多。圖 1 所示是用繼淨:關系實作的汽車分類的類圖。

合成複用原則——面向對象設計原則

 從圖 1 可以看出用繼承關系實作會産生很多子類,而且增加新的“動力源”或者增加新的“顔色”都要修改源代碼,這違背了開閉原則,顯然不可取。但如果改用組合關系實作就能很好地解決以上問題,其類圖如圖 2 所示。

合成複用原則——面向對象設計原則