必知必會的設計原則——合成復用原則

来源:https://www.cnblogs.com/mhg215/archive/2023/02/14/17117235.html
-Advertisement-
Play Games

設計原則系列文章 必知必會的設計原則——單一職責原則 必知必會的設計原則——開放封閉原則 必知必會的設計原則——依賴倒置原則 必知必會的設計原則——里氏替換原則 必知必會的設計原則——介面隔離原則 必知必會的設計原則——迪米特原則 必知必會的設計原則——合成復用原則 概述 在面向對象設計中,可以通過 ...


 設計原則系列文章 

  1. 必知必會的設計原則——單一職責原則
  2. 必知必會的設計原則——開放封閉原則
  3. 必知必會的設計原則——依賴倒置原則
  4. 必知必會的設計原則——里氏替換原則
  5. 必知必會的設計原則——介面隔離原則
  6. 必知必會的設計原則——迪米特原則
  7. 必知必會的設計原則——合成復用原則

概述

在面向對象設計中,可以通過兩種方法在不同的環境中復用已有的設計和實現,即通過組合/ 聚合關係或通過繼承,但首先應該考慮使用組合/聚合,組合/聚合可以使系統更加靈活,降低 類與類之間的耦合度,一個類的變化對其他類造成的影響相對較少;其次才考慮繼承,在使用繼承時,需要嚴格遵循里氏代換原則,有效使用繼承會有助於對問題的理解,降低複雜 度,而濫用繼承反而會增加系統構建和維護的難度以及系統的複雜度,因此需要慎重使用繼 承復用。

合成復用原則又稱為組合/聚合復用原則;儘量使用對象組合,而不是繼承來達到復用。

“某種程度上 繼承有問題”:破壞了系統的封裝性,基類發生了改變,子類的實現也會發生改變;子類如果不需要基類中的方法,那麼系統耦合性就開始變高;繼承是靜態的,不能在程式運行時發生改變;

以上圖片展示的關於汽車繼承案例問題,這個需求如果增加,可以一直繼承下去,系統慢慢...

繼承案例代碼

    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^)\\\~~~ .

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

如果您有其他問題,也歡迎關註我下方的公眾號,可以聯繫我一起交流切磋!

碼雲:碼雲      github:github


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如果是首次安裝Dev只需要下麵兩步流程就可以第一步安裝試用的最新版 Devexpress 22.2.4這步看直接去官網,安裝官方試用的就可以第二步安裝破解補丁關閉防火牆或360 然後打開 DevExpress.Universal.Patch 選擇22.2 版本 和對應的visual studio 的 ...
  • 什麼是API限流: API 限流是限制用戶在一定時間內 API 請求數量的過程。應用程式編程介面 (API) 充當用戶和軟體應用程式之間的網關。例如,當用戶單擊社交媒體上的發佈按鈕時,點擊該按鈕會觸發 API 調用。此 API 與社交媒體應用程式的網路伺服器進行交互,並執行發佈操作。此用戶可以是人, ...
  • AOP 視頻講解 面向切麵編程AOP的對面向對象編程OOP的一個補充,它的特點是將系統邏輯和業務邏輯採取《非侵入式》分離。我們把系統封裝成一個一個的切麵(單一職責)進行順意編排組合,插入(織入)到業務邏輯的執行過程(織入點)。 系統邏輯:異常處理,身份認證,授權,mvc,數據校驗,事務處理。 業務邏 ...
  • Configuration 視頻講解 package說明 Microsoft.Extensions.Configuration.Abstractions:抽象包,一大堆的介面 Microsoft.Extensions.Configuration.Binder:提供一大堆的擴展,比如類型轉換 Micr ...
  • IOC 視頻講解 基礎概念 Microsoft.Extensions.DependencyInjection.Abstractions:抽象包 Microsoft.Extensions.DependencyInjection:實現包 IServiceCollection:用於註冊服務(菜譜,記錄了每 ...
  • 支持.Net Core(2.0及以上)/.Net Framework(4.5及以上),可以部署在Docker, Windows, Linux, Mac。 RabbitMQ作為一款主流的消息隊列工具早已廣受歡迎。相比於其它的MQ工具,RabbitMQ支持的語言更多、功能更完善。 本文提供一種市面上最/ ...
  • LibVLCSharp.WPF簡介 從vlc說起 vlc是一個開源的跨平臺視頻播放庫,使用C/C++編寫,vlc底層基於ffmpeg。地址:https://github.com/videolan/vlc LibVLC是對vlc的封裝,提供了開發的靈活性、便捷性,統一和更加高級的api。C/C++編寫 ...
  • 一.寫在前面 System.Text.Json 是 .NET Core 3 及以上版本內置的 Json 序列化組件,剛推出的時候經常看到踩各種坑的吐槽,現在經過幾個版本的迭代優化,提升了易用性,修複了各種問題,是時候考慮使用 System.Text.Json 了。本文將從使用層面來進行對比。 Sys ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...