標籤:com 技術分享 play 靈活 學生 步驟 border 關係 test
引言
提到模板,大家肯定不免想到生活中的“簡曆模板”、“論文模板”、“Word中模版檔案”等,在現實生活中,模板的概念就是——有一個規定的格式,然後每個人都可以根據自己的需求或情況去更新它,例如簡曆模板,下載下來的簡曆模板的格式都是相同的,然而我們下載下來簡曆模板之後我們可以根據自己的情況填充不同的內容要完成屬於自己的簡曆。在設計模式中,模板方法模式中模板和生活中模板概念非常類似,下面讓我們就詳細介紹模板方法的定義,大家可以根據生活中模板的概念來理解模板方法的定義。
模板方法介紹
模板方法模式的定義
定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中,模仿方法使得子類可以不改變一個演算法的結構既可重定義該演算法的某些特定步驟
模仿方法模式的結構圖
模式的組成
AbstractClass是抽象類別,其實也就是一個抽象模板,定義並實現了一個模板方法,這個模板方法一般是一個具體的方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,延遲到子類實現,頂級邏輯也有可能調用一些具體的方法
ConcreteClass實現了父類所定義的一個或多個抽象放啊,每一個AbstractClass都可以有任意多個ConcreteClass與之對應,而每一個ConcreteClass都可以出這些抽象方法(也就是頂級邏輯的組成步驟)不同的實現,從而使得頂級邏輯的實現各不相同
看了模板方法的定義以及結構圖,下面我們來看看在代碼中如何使用
題目:要下課了老師在黑板出家庭作業,每個學生都要抄題目。
第一版無模式
/// <summary> /// 學生甲 /// </summary> public class MethodA { public void TestQuestion1() { Console.WriteLine("試題一【】 a.正確 b 錯誤 c 無解"); Console.WriteLine("答案:b"); } public void TestQuestion2() { Console.WriteLine("試題二【】 a.正確 b 錯誤 c 無解"); Console.WriteLine("答案:a"); } public void TestQuestion3() { Console.WriteLine("試題三【】 a.正確 b 錯誤 c 無解"); Console.WriteLine("答案:c"); } } /// <summary> /// 學生已 /// </summary> public class MethodB { public void TestQuestion1() { Console.WriteLine("試題一【】 a.正確 b 錯誤 c 無解"); Console.WriteLine("答案:b"); } public void TestQuestion2() { Console.WriteLine("試題二【】 a.正確 b 錯誤 c 無解"); Console.WriteLine("答案:a"); } public void TestQuestion3() { Console.WriteLine("試題三【】 a.正確 b 錯誤 c 無解"); Console.WriteLine("答案:c"); } } /// <summary> /// 用戶端 /// </summary> class Program { static void Main(string[] args) { Console.WriteLine("學生甲的試題:"); MethodA a = new MethodA(); a.TestQuestion1(); a.TestQuestion2(); a.TestQuestion3(); Console.WriteLine("學生已的試題:"); MethodB B= new MethodB(); B.TestQuestion1(); B.TestQuestion2(); B.TestQuestion3(); } }View Code
可以看出內容相識度很高,除了答案不同,沒什麼不一樣了,這樣的代碼容易出錯,難以維護,學習了模板方法以後進行改版
第二版
/// <summary> /// 抽象類別 /// </summary> public abstract class TestQuestion { public void TestQuestion1() { Console.WriteLine("試題一【】 a.正確 b 錯誤 c 無解"); Console.WriteLine("答案:"+ Anster1()); } public void TestQuestion2() { Console.WriteLine("試題二【】 a.正確 b 錯誤 c 無解"); Console.WriteLine("答案:"+Anster2()); } public void TestQuestion3() { Console.WriteLine("試題三【】 a.正確 b 錯誤 c 無解"); Console.WriteLine("答案:"+ Anster3()); } public virtual string Anster1() { return ""; } public virtual string Anster2() { return ""; } public virtual string Anster3() { return ""; } } /// <summary> /// 學生甲 /// </summary> public class MethodA:TestQuestion { public override string Anster1() { return "a"; } public override string Anster2() { return "b"; } public override string Anster3() { return "c"; } } /// <summary> /// 用戶端 /// </summary> class Program { static void Main(string[] args) { Console.WriteLine("學生甲的試題:"); TestQuestion a = new MethodA(); a.TestQuestion1(); a.TestQuestion2(); a.TestQuestion3(); } }View Code
y引入模板方法模式後,代碼的可讀性增加了,將不變的代碼抽象為父類,子類子需要填寫答案就行了
模板方法模式的優缺點
優點:
- 實現了代碼複用
- 能夠靈活應對子步驟的變化,符合開放-封閉原則
缺點:因為引入了一個抽象類別,如果具體實現過多的話,需要使用者或開發人員需要花更多的時間去理清類之間的關係。
附:在.NET中模板方法的應用也很多,例如我們在開發自訂的Web控制項或WinForm控制項時,我們只需要重寫某個控制項的部分方法總結
到這裡,模板方法的介紹就結束了,模板方法模式在抽象類別中定義了演算法的實現步驟,將這些步驟的實現延遲到具體子類中去實現,從而使所有子類複用了父類的代碼,所以模板方法模式是基於繼承的一種實現代碼複用的技術。
c#設計模式系列:模板方法模式(Template Method Pattern)