當模板方法遇到了委托函數,你的代碼又可以精簡了

来源:https://www.cnblogs.com/huangxincheng/archive/2020/04/12/12684317.html
-Advertisement-
Play Games

現如今當你翻看一些開源項目源碼的時候,你會發現現在到處充斥著委托函數,如Func,Action,Predicate,確實現在的C 在函數式編程的路上越來越成為主流,越來越顯示威力,曾經的一些經典設計模式寫法,在函數式下可以稍微優化一下了,這篇我們就來說說模板方法。 一:實際場景 1. 模板方法定義 ...


現如今當你翻看一些開源項目源碼的時候,你會發現現在到處充斥著委托函數,如Func,Action,Predicate,確實現在的C#在函數式編程的路上越來越成為主流,越來越顯示威力,曾經的一些經典設計模式寫法,在函數式下可以稍微優化一下了,這篇我們就來說說模板方法。

一:實際場景

1. 模板方法定義

相信這個模式在平時開發中會經常使用到,定義也很簡單,在父類中定義演算法骨架,骨架裡面的某些細節點由相應的子類實現。

2. 業務場景

給用戶推送彩信的時候,公司需要對接很多的彩信服務商,比如說博士通,助通,聯合維拓,而每一家對提交彩信的格式有不同的要求,比如說:博士通和助通會要求所有的內容按指定格式進行base64編碼提交過去,聯合維拓會要求你按指定格式打包成一個zip文件流過去,這就是一個經典的模板模式,可以在父類中定義好構造彩信的演算法骨架,具體細節可以由各自廠家子類實現,為了方便演示畫圖如下:

源碼如下:

    class MmsTemplate
    {
        public virtual string GetHeader() { return string.Empty; }
        public virtual string GetBody() { return string.Empty; }
        public virtual string GetTail() { return string.Empty; }

        public virtual void ProcessRequest()
        {
            Console.WriteLine($"1. 彩信頭:{GetHeader()}");
            Console.WriteLine($"2. 彩信體:{GetBody()}");
            Console.WriteLine($"3. 彩信尾:{GetTail()}");
        }
    }

    class ZhutongTemplate : MmsTemplate
    {
        public override string GetHeader() { return "我是助通頭!"; }

        public override string GetTail() { return "我是助通體!"; }

        public override string GetBody() { return "我是助通尾!"; }

        public override void ProcessRequest() { base.ProcessRequest(); }
    }

    class LianheweituoTemplate : MmsTemplate
    {
        public override string GetHeader() { return "我是聯合維拓頭!"; }

        public override string GetTail() { return "我是聯合維拓體!"; }

        public override string GetBody() { return "我是聯合維拓尾!"; }

        public override void ProcessRequest() { base.ProcessRequest(); }
    }

然後客戶端可以根據指定通道配置調用相應的子類實現不同廠家的彩信體構建。

二:委托函數

1. 反思

在面向對象編程語言中,這種寫法都堪稱標準,我們先來捋一下流程,子類入口 → 執行父類方法 → 調用子類方法 如下圖

從上圖中可以發現一個問題,父類在執行演算法骨架的時候,為了能夠再次執行到該子類方法,在面向對象編程中必須要使用的技術就是多態,而為了構造多態,就必須在父類中定義一堆方法,然後由子類實現這一堆方法,這就是你看到的GetHeader(),GetTail(),GetBody()的由來,這時就顯得有點老態龍鐘。

2. 回調函數

仔細看一下這個xmind圖,ZhutongTemplate類調用的MmsTemplate的方法,MmsTemplate在執行的時候再調用ZhutongTemplate的方法,前者叫調用,後者叫回調,如果還不明白,那前者叫送禮,後者叫回禮。。。 對,既然在以前是用多態製造回調,那我是不是可以直接使用C#中的委托函數更簡單粗暴呢?

3. 改造模板

直接看代碼吧,千言難抵上代碼。


    class MmsTemplate
    {
        protected Func<string> header;
        protected Func<string> body;
        protected Func<string> tail;

        public virtual void ProcessRequest()
        {
            Console.WriteLine($"1. 彩信頭:{header()}");
            Console.WriteLine($"2. 彩信體:{header()}");
            Console.WriteLine($"3. 彩信尾:{tail()}");
        }
    }

    class ZhutongTemplate : MmsTemplate
    {
        public override void ProcessRequest()
        {
            this.header = () => "我是助通頭!";
            this.body = () => "我是助通體";
            this.tail = () => "我是助通尾!";

            base.ProcessRequest();
        }
    }

    class LianheweituoTemplate : MmsTemplate
    {
        public override void ProcessRequest()
        {
            this.header = () => "我是聯合維拓頭!";
            this.body = () => "我是聯合維拓體";
            this.tail = () => "我是聯合維拓尾!";

            base.ProcessRequest();
        }
    }

從上面代碼中可以看到,原來需要多態實現的地方直接由委托變數接管,看起來是不是比之前的多態版簡潔了很多。

好了,本篇就說到這裡,更多的變通玩法期待您的發現~


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

-Advertisement-
Play Games
更多相關文章
  • 前言 隨著 Web 2.0 時代的到來,互聯網的網路架構已經從傳統的 架構轉變為更加方便、快捷的 架構,B/S 架構大大簡化了用戶使用網路應用的難度,提高了用戶體驗。 架構帶來了以下兩方面的好處: 客戶端使用統一的瀏覽器( )。由於瀏覽器具有統一性,不需要特殊的配置和網路連接。另外瀏覽器的交互特性使 ...
  • 服務提供者 創建一個名為 的服務提供者項目 POM 該項目下有兩個子模塊,分別是 和 ,前者用於定義介面,後者用於實現介面。 服務提供者介面模塊 在服務提供者項目下創建一個名為 的模塊, 該項目模塊只負責 定義介面 POM 定義一個介面 服務提供者介面實現模塊 創建名為 服務提供者介面的實現模塊,用 ...
  • 什麼是 Nacos Config 在分散式系統中,由於服務數量巨多,為了方便服務 配置文件統一管理 , 實時更新 ,所以需要分散式配置中心組件。 是 的替代方案。 的存儲配置功能為分散式系統中的外部化配置提供伺服器端和客戶端支持,可以在 中集中管理 Spring Cloud 應用的外部屬性配置。 引 ...
  • ASP.NET CORE出現之前我們實現的Controller,MVC都繼承自Controller基類,WebApi的話繼承自ApiController。現在ASP.NET CORE把MVC跟WebApi合併了,已經不再區分MVC或者WebApi。ASP.NET CORE的Controller繼承結... ...
  • 上一章介紹的ColorPicker控制項,是控制項設計的最好示例。因為其行為和可視化外觀是精心分離的,所以其他設計人員可開發動態改變其外觀的新模板。 ColorPicker控制項如此簡單的一個原因是不涉及狀態。換句話說,不根據是否具有焦點、滑鼠是否在它上面懸停、是否禁用等狀態區分其可視化外觀。接下來本章介 ...
  • Navicat is a series of graphical database management and development software produced by PremiumSoft CyberTech Ltd. for MySQL, MariaDB, Oracle, SQLit... ...
  • 昨天大致把思路理清楚了,用one hot的方式把關鍵詞按字拆開編碼,今天嘗試可行性。 目前主流的文本向量化方式主要包括one hot、tf (term frequency)和tf idf (term frequency–inverse document frequency)這三種,越往後準確度應該越 ...
  • 前言 在上一篇導出文檔番外篇中,我們已經熟悉了怎樣根據json數據導出word的文檔,生成介面文檔,而在這一篇,將對上一篇進行完善補充,增加多種導出方式,實現更加完善的導出功能。 回顧 1. 獲取Swagger介面文檔的Json文件 2. 解析Json文件數據填充到Html的表格中 3.根據生成的h ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...