1. 程式人生 > >設計模式(八)面向對象設計原則之合成復用原則

設計模式(八)面向對象設計原則之合成復用原則

擴展 會有 作者 如果 composite info 繼承 裏氏代換原則 oracle數據

引用自:http://blog.csdn.net/lovelion 作者:劉偉

合成復用原則(Composite Reuse Principle, CRP):盡量使用對象組合,而不是繼承來達到復用的目的。

合成復用原則就是在一個新的對象裏通過關聯關系(包括組合關系和聚合關系)來使用一些已有的對象,使之成為新對象的一部分;

新對象通過委派調用已有對象的方法達到復用功能的目的。簡言之:復用時要盡量使用組合/聚合關系(關聯關系),少用繼承

在面向對象設計中,可以通過兩種方法在不同的環境中復用已有的設計和實現,即通過組合/聚合關系或通過繼承,

首先應該考慮使用組合/聚合組合/聚合可以使系統更加靈活,降低類與類之間的耦合度

,一個類的變化對其他類造成的影響相對較少;

其次才考慮繼承,在使用繼承時,需要嚴格遵循裏氏代換原則,有效使用繼承會有助於對問題的理解,降低復雜度,

濫用繼承反而會增加系統構建和維護的難度以及系統的復雜度,因此需要慎重使用繼承復用。

一般而言,如果兩個類之間是“Has-A”的關系應使用組合或聚合,如果是“Is-A”關系可使用繼承"Is-A"是嚴格的分類學意義上的定義,

意思是一個類是另一個類的"一種";而"Has-A"則不同,它表示某一個角色具有某一項責任

下面通過一個簡單實例來加深對合成復用原則的理解:

技術分享圖片

技術分享圖片

在圖2中,CustomerDAO和DBUtil之間的關系由繼承關系變為關聯關系,采用依賴註入的方式將DBUtil對象

註入到CustomerDAO中,可以使用構造註入,也可以使用Setter註入。如果需要對DBUtil的功能進行擴展,

可以通過其子類來實現,如通過子類OracleDBUtil來連接Oracle數據庫。由於CustomerDAO針對DBUtil編程,

根據裏氏代換原則,DBUtil子類的對象可以覆蓋DBUtil對象,只需在CustomerDAO中註入子類對象即可使用子類

所擴展的方法。例如在CustomerDAO中註入OracleDBUtil對象,即可實現Oracle數據庫連接,

原有代碼無須進行修改,而且還可以很靈活地增加新的數據庫連接方式。

設計模式(八)面向對象設計原則之合成復用原則