合成複用原則: 儘可能使用對象組合, 而不是繼承來達到複用的目的..net
合成複用原則就是在一個新的對象裏經過關聯關係(包括組合關係和聚合關係)來使用一些已有的對象, 使之成爲新對象的一部分; 新對象經過委派調用已有對象的方法達到複用的目的. 簡言之: 複用時要儘可能經過組合/聚合關係(關聯關係), 少用繼承.設計
在面向對象設計中, 能夠經過兩種方法在不一樣的環境中複用已有的設計和實現, 既*經過組合/聚合關係或者經過繼承關係, 但首先應該考慮組合/聚合, *組合/聚合可使系統更加靈活, 下降類與類之間的耦合度, 一個類的變化對其它類形成的影響較少; 其次才考慮繼承關係, 在繼承時, 要嚴格遵循里氏代換原則, 有效使用繼承會有助於對問題的理解, 下降複雜度, 而濫用繼承反而會增長系統構建和維護的難度以及系統的複雜度, 所以要慎重使用繼承複合.對象
經過繼承來進行復用的主要問題在於繼承複用會破壞系統的封裝性,由於繼承會將基類的實現細節暴露給子類,因爲基類的內部細節一般對子類來講是可見的,因此這種複用又稱「白箱」複用,若是基類發生改變,那麼子類的實現也不得不發生改變;從基類繼承而來的實現是靜態的,不可能在運行時發生改變,沒有足夠的靈活性;並且繼承只能在有限的環境中使用(如類沒有聲明爲不能被繼承)。blog
因爲組合或聚合關係能夠將已有的對象(成員對象)歸入到新對象中, 使之成爲新對象的一部分, 所以新對象能夠調用已有對象的功能, 這楊做可使得成員對象內部實現細節對於新對象不可見, 因此這種複用又稱爲"黑箱"複用, 相對繼承關係來講, 耦合度下降, 成員對象的變化對新對象影響不大, 能夠在新對象中根據實際須要有選擇的調用成員對象的操做; 合成複合能夠在運行時動態進行, 新對象能夠動態的引用與成員對象類型相同的其餘對象.繼承
通常而言, 若是兩個類之間是 "Has-A" 的關係應該使用組合/聚合; 若是是 "Is-A" 關係可使用繼承. "Is-A" 是嚴格的分類學意義上的一個定義, 意思是一個類是另外一個類的"一種"; "Has-A" 表示某一個角色具備某一項職責.get
詳細示例請參考原文:io
Reference: http://blog.csdn.net/lovelion/article/details/7563441引用