設計原則系列文章 必知必會的設計原則——單一職責原則 必知必會的設計原則——開放封閉原則 必知必會的設計原則——依賴倒置原則 必知必會的設計原則——里氏替換原則 必知必會的設計原則——介面隔離原則 必知必會的設計原則——迪米特原則 必知必會的設計原則——合成復用原則 概述 在面向對象設計中,可以通過 ...
設計原則系列文章
- 必知必會的設計原則——單一職責原則
- 必知必會的設計原則——開放封閉原則
- 必知必會的設計原則——依賴倒置原則
- 必知必會的設計原則——里氏替換原則
- 必知必會的設計原則——介面隔離原則
- 必知必會的設計原則——迪米特原則
- 必知必會的設計原則——合成復用原則
概述
在面向對象設計中,可以通過兩種方法在不同的環境中復用已有的設計和實現,即通過組合/ 聚合關係或通過繼承,但首先應該考慮使用組合/聚合,組合/聚合可以使系統更加靈活,降低 類與類之間的耦合度,一個類的變化對其他類造成的影響相對較少;其次才考慮繼承,在使用繼承時,需要嚴格遵循里氏代換原則,有效使用繼承會有助於對問題的理解,降低複雜 度,而濫用繼承反而會增加系統構建和維護的難度以及系統的複雜度,因此需要慎重使用繼 承復用。合成復用原則又稱為組合/聚合復用原則;儘量使用對象組合,而不是繼承來達到復用。
“某種程度上 繼承有問題”:破壞了系統的封裝性,基類發生了改變,子類的實現也會發生改變;子類如果不需要基類中的方法,那麼系統耦合性就開始變高;繼承是靜態的,不能在程式運行時發生改變;
以上圖片展示的關於汽車繼承案例問題,這個需求如果增加,可以一直繼承下去,系統慢慢...
繼承案例代碼
public class A { public void Methond1() { Console.WriteLine("我是方法1"); } public void Methond2() { Console.WriteLine("我是方法2"); } public void B_Methond3() { Console.WriteLine("我是方法3"); } } public class B : A { public void MethondB() { } } public class C : B { public void MethondC() { } } public class D : C { public void MethondD() { } }
結論:問題是有些方法B類並不需要,然而在A類中實現後,B類都需要繼承,這就是問題,導致職責不清晰,越來越臃腫!以後新增需求,像C又繼承B...
關於汽車案例的需求改用合成復用原則實現
public interface IColor { public string ShowCar(); } public class Green : IColor { public string ShowCar() { return "綠色"; } } public class Red : IColor { public string ShowCar() { return "紅色"; } } //)—————————————————————————————————————————————————— public abstract class Car { public abstract void Run(IColor color); } public class QyCar : Car { public override void Run(IColor color) { Console.WriteLine($"汽油式的{color.ShowCar()}顏色車在行駛"); } } public class DdCar : Car { public override void Run(IColor color) { Console.WriteLine($"電動式的{color.ShowCar()}顏色車在行駛"); } }
結論:像這個汽車行駛的需求,不管以後又有黑色的、藍色的汽車,或者加水的汽車之類都做好了擴展,不用再使用繼承去解決這個問題。
總結
關於合成復用原則在現實編碼過程中,尤其對重構系統特別有用,所有的設計原則系列文章都已經更新完畢,有何疑問,歡迎交流。
作者:realyrare
出處:https://www.cnblogs.com/mhg215/
聲援博主:如果您覺得文章對您有幫助,請點擊文章末尾的【關註我】吧!
別忘記點擊文章右下角的【推薦】支持一波。~~~///(^v^)\\\~~~ .
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
如果您有其他問題,也歡迎關註我下方的公眾號,可以聯繫我一起交流切磋!
