提到模板,大家肯定不免想到生活中的“簡歷模板”、“論文模板”、“Word中模版文件”等,在現(xiàn)實生活中,模板的概念就是——有一個規(guī)定的格式,然后每個人都可以根據(jù)自己的需求或情況去更新它,例如簡歷模板,下載下來的簡歷模板的格式都是相同的,然而我們下載下來簡歷模板之后我們可以根據(jù)自己的情況填充不同的內(nèi)容要完成屬于自己的簡歷。在設(shè)計模式中,模板方法模式中模板和生活中模板概念非常類似,下面讓我們就詳細介紹模板方法的定義,大家可以根據(jù)生活中模板的概念來理解模板方法的定義。
平原網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),平原網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為平原上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的平原做網(wǎng)站的公司定做!
模板方法模式——在一個抽象類中定義一個操作中的算法骨架(對應(yīng)于生活中的大家下載的模板),而將一些步驟延遲到子類中去實現(xiàn)(對應(yīng)于我們根據(jù)自己的情況向模板填充內(nèi)容)。模板方法使得子類可以不改變一個算法的結(jié)構(gòu)前提下,重新定義算法的某些特定步驟,模板方法模式把不變行為搬到超類中,從而去除了子類中的重復(fù)代碼。
理解了模板方法的定義之后,自然實現(xiàn)模板方法也不是什么難事了,下面以生活中炒蔬菜為例來實現(xiàn)下模板方法模式。在現(xiàn)實生活中,做蔬菜的步驟都大致相同,如果我們針對每種蔬菜類定義一個燒的方法,這樣在每個類中都有很多相同的代碼,為了解決這個問題,我們一般的思路肯定是把相同的部分抽象出來到抽象類中去定義,具體子類來實現(xiàn)具體的不同部分,這個思路也正式模板方法的實現(xiàn)精髓所在,具體實現(xiàn)代碼如下:
// 客戶端調(diào)用 class Client { static void Main(string[] args) { // 創(chuàng)建一個菠菜實例并調(diào)用模板方法 Spinach spinach = new Spinach(); spinach.CookVegetabel(); Console.Read(); } } public abstract class Vegetabel { // 模板方法,不要把模版方法定義為Virtual或abstract方法,避免被子類重寫,防止更改流程的執(zhí)行順序 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(); // 開發(fā)翻炒蔬菜 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("倒大白菜進鍋中"); } }
在上面的實現(xiàn)中,具體子類中重寫了導(dǎo)入蔬菜種類的方法,因為這個真是燒菜方法中不同的地方,所以由具體子類去實現(xiàn)它。
實現(xiàn)完模板方法模式之后,讓我們看看模板方法的類圖結(jié)構(gòu),以理清該模式中類之間的關(guān)系,具體類圖如下:
模板方法模式中涉及了兩個角色:
抽象模板角色(Vegetable扮演這個角色):定義了一個或多個抽象操作,以便讓子類實現(xiàn),這些抽象操作稱為基本操作。
具體模板角色(ChineseCabbage和Spinach扮演這個角色):實現(xiàn)父類所定義的一個或多個抽象方法。
下面讓我們繼續(xù)分析下模板方法的優(yōu)缺點。
優(yōu)點:
實現(xiàn)了代碼復(fù)用
能夠靈活應(yīng)對子步驟的變化,符合開放-封閉原則
缺點:因為引入了一個抽象類,如果具體實現(xiàn)過多的話,需要用戶或開發(fā)人員需要花更多的時間去理清類之間的關(guān)系。
附:在.NET中模板方法的應(yīng)用也很多,例如我們在開發(fā)自定義的Web控件或WinForm控件時,我們只需要重寫某個控件的部分方法。
到這里,模板方法的介紹就結(jié)束了,模板方法模式在抽象類中定義了算法的實現(xiàn)步驟,將這些步驟的實現(xiàn)延遲到具體子類中去實現(xiàn),從而使所有子類復(fù)用了父類的代碼,所以模板方法模式是基于繼承的一種實現(xiàn)代碼復(fù)用的技術(shù)。
分享名稱:C#設(shè)計模式(14)——模板方法模式(TemplateMethod)
當前URL:http://chinadenli.net/article30/giecpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、電子商務(wù)、、靜態(tài)網(wǎng)站、用戶體驗、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)