C#設計模式(14)——模板方法模式(Template Method)


一、引言

提到模板,大家肯定不免想到生活中的“簡歷模板”、“論文模板”、“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控件時,我們只需要重寫某個控件的部分方法。

四、總結

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM