設計模式(十四)模板方法模式(Template Pattern)

来源:http://www.cnblogs.com/xiongzaiqiren/archive/2016/03/28/5328790.html
-Advertisement-
Play Games

一、引言 提到模板,大家肯定不免想到生活中的“簡歷模板”、“論文模板”、“Word中模版文件”等,在現實生活中,模板的概念就是——有一個規定的格式,然後每個人都可以根據自己的需求或情況去更新它,例如簡歷模板,下載下來的簡歷模板的格式都是相同的,然而我們下載下來簡歷模板之後我們可以根據自己的情況填充不 ...


一、引言

  提到模板,大家肯定不免想到生活中的“簡歷模板”、“論文模板”、“Word中模版文件”等,在現實生活中,模板的概念就是——有一個規定的格式,然後每個人都可以根據自己的需求或情況去更新它,例如簡歷模板,下載下來的簡歷模板的格式都是相同的,然而我們下載下來簡歷模板之後我們可以根據自己的情況填充不同的內容要完成屬於自己的簡歷。在設計模式中,模板方法模式中模板和生活中模板概念非常類似,下麵讓我們就詳細介紹模板方法的定義,大家可以根據生活中模板的概念來理解模板方法的定義。

二、模板方法模式詳細介紹

2.1 模板方法模式的定義

  模板方法模式——在一個抽象類中定義一個操作中的演算法骨架(對應於生活中的大家下載的模板),而將一些步驟延遲到子類中去實現(對應於我們根據自己的情況向模板填充內容)。模板方法使得子類可以不改變一個演算法的結構前提下,重新定義演算法的某些特定步驟,模板方法模式把不變行為搬到超類中,從而去除了子類中的重覆代碼。

2.2 模板方法模式的實現

  理解了模板方法的定義之後,自然實現模板方法也不是什麼難事了,下麵以生活中炒蔬菜為例來實現下模板方法模式。在現實生活中,做蔬菜的步驟都大致相同,如果我們針對每種蔬菜類定義一個燒的方法,這樣在每個類中都有很多相同的代碼,為瞭解決這個問題,我們一般的思路肯定是把相同的部分抽象出來到抽象類中去定義,具體子類來實現具體的不同部分,這個思路也正式模板方法的實現精髓所在,具體實現代碼如下:

    // 客戶端調用
    class Client
    {
        static void Main(string[] args)
        {
            // 創建一個菠菜實例並調用模板方法
            Spinach spinach = new Spinach();
            spinach.CookVegetabel();
            Console.Read();
        }
    }
    public abstract class Vegetabel
    {
        // 模板方法,不要把模版方法定義為Virtual或abstract方法,避免被子類重寫,防止更改流程的執行順序
        public  void CookVegetabel()
        {
            Console.WriteLine("抄蔬菜的一般做法");
            this.pourOil();
            this.HeatOil();
            this.pourVegetable();
            this.stir_fry();
        }
        // 第一步倒油
        public  void pourOil()
        {
            Console.WriteLine("倒油");
        }
        // 把油燒熱
        public  void HeatOil()
        {
            Console.WriteLine("把油燒熱");
        }
        // 油熱了之後倒蔬菜下去,具體哪種蔬菜由子類決定
        public abstract void pourVegetable();
        // 開發翻炒蔬菜
        public  void stir_fry()
        {
            Console.WriteLine("翻炒");
        }
    }
    // 菠菜
    public class Spinach : Vegetabel
    {
            
        public override void pourVegetable()
        {
            Console.WriteLine("倒菠菜進鍋中");
        }
    }
    // 大白菜
    public class ChineseCabbage : Vegetabel
    {    
        public override void pourVegetable()
        {
            Console.WriteLine("倒大白菜進鍋中");
        }
    }

在上面的實現中,具體子類中重寫了導入蔬菜種類的方法,因為這個真是燒菜方法中不同的地方,所以由具體子類去實現它。

2.3 模板方法模式的類圖

實現完模板方法模式之後,讓我們看看模板方法的類圖結構,以理清該模式中類之間的關係,具體類圖如下:

模板方法模式中涉及了兩個角色:

  抽象模板角色(Vegetable扮演這個角色):定義了一個或多個抽象操作,以便讓子類實現,這些抽象操作稱為基本操作。
  具體模板角色(ChineseCabbage和Spinach扮演這個角色):實現父類所定義的一個或多個抽象方法。


三、模板方法模式的優缺點

下麵讓我們繼續分析下模板方法的優缺點。

優點:

  1,實現了代碼復用;
  2,能夠靈活應對子步驟的變化,符合開放-封閉原則;


缺點:

因為引入了一個抽象類,如果具體實現過多的話,需要用戶或開發人員需要花更多的時間去理清類之間的關係。

 

附:在.NET中模板方法的應用也很多,例如我們在開發自定義的Web控制項或WinForm控制項時,我們只需要重寫某個控制項的部分方法。

四、總結

  到這裡,模板方法的介紹就結束了,模板方法模式在抽象類中定義了演算法的實現步驟,將這些步驟的實現延遲到具體子類中去實現,從而使所有子類復用了父類的代碼,所以模板方法模式是基於繼承的一種實現代碼復用的技術。

 

以上內容摘抄自:http://learninghard.blog.51cto.com/6146675/1316446

 


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

-Advertisement-
Play Games
更多相關文章
  • 我個人比較喜歡寫註釋,在工作中對註釋的重要性看的也比較高,所以大部分文字都在註釋中,代碼外的文字會寫的偏少,關鍵能懂就行 先看一下整合後的工程目錄(單工程,多工程以後會採用maven) 5個package分別對應 action, entity, mapper(也就是DAO,採用動態代理), serv ...
  • 課程總共包含100個課時,總授課長達27多個小時,內容覆蓋面廣,從入門到精通,授課通俗易懂,分析問題獨到精辟通過本套視頻的學習,學員能夠快速的掌握java編程語言,成為java高手。課程目錄:課時1 01lesson1 Java概述 17:18課時2 02lesson1 Java跨平臺的原理 11: ...
  • 教程簡介 本教程由後盾網講解,共40節,主要介紹了美團網的開發,從需求分析出發,對商鋪的建立、購物流程的構建及訂單處理等都做了詳細的介紹,非常適合做電子商務開發的朋友和同學參考學習使用,完整教程可以在本站下載觀看,同時提供部分章節線上觀看,完整目錄如下: 1.項目介紹,流程分析以及表關係建立2.後臺 ...
  • 後盾網教程統一大集合整理(內容較多,請自備紙巾) 傳送門:http://fu83.cn/thread-162-1-1.html ...
  • 什麼叫架構?揭開架構神秘的面紗,無非就是:分層+模塊化。任意複雜的架構,你也會發現架構師也就做了這兩件事。 本文將會全面的介紹我們團隊在模塊化設計方面取得的經驗。之所以加了“全面”二字,是因為本文的內容將會涉及到:資料庫、路由、C#、JavaScript、CSS、HTML等一個完整模塊所需要的內容。 ...
  • 序言 在.Net的世界中,一提及SOA,大家想到的應該是Web Service,WCF,還有人或許也會在.NET MVC中的Web API上做上標記,然後泛泛其談! 的確,微軟的這些技術也確實推動著面向服務的世界發展,當然除了微軟還有很多面向服務的開源技術,甚至在某些方面比微軟做的更加優秀。那麼什麼 ...
  • 一、前言 面向對象技術可以很好地解決一些靈活性或可擴展性問題,但在很多情況下需要在系統中增加類和對象的個數。當對象數量太多時,將導致運行代價過高,帶來性能下降等問題。 享元模式正是為解決這一類問題而誕生的。享元模式通過共用技術實現相同或相似對象的重用。 在享元模式中通常會出現工廠模式,需要創建一個享 ...
  • * 軟體腐化的原因: 問題所在 設計目標 過於僵硬 可擴展性(新性能可以很容易加入系統)過於脆弱 靈活性(修改不會波及其它)復用率低 粘度過高 可插入性(新功能容易加入系統(氣囊加入方向盤)) * 提高系統可復用性的幾點原則:傳統復用:1. 代碼的粘帖復用2. 演算法的復用3. 數據結構的復用 * 可 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...