設計模式(八)面向對象設計原則之合成復用原則
引用自: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數據庫連接,
原有代碼無須進行修改,而且還可以很靈活地增加新的數據庫連接方式。
設計模式(八)面向對象設計原則之合成復用原則