一、定義
模板方法模式:定義一個操作中算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
解釋:簡單來說,需要定義一個通用的基類,但是基類中不同的操作,于是模板方法模式將不同的操作編寫成一個抽象函數放到子類中實現,這樣即可完成通用基類的目的。
二、UML類圖及基本代碼

基本代碼:
abstract class AbstractClass { public abstract void PRimitiveOperation1(); public abstract void PrimitiveOperation2(); public void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); Console.WriteLine("基類的行為"); } } class ConcreteClassA : AbstractClass { public override void PrimitiveOperation1() { Console.WriteLine("具體類A方法1的實現"); } public override void PrimitiveOperation2() { Console.WriteLine("具體類A方法2的實現"); } } class ConcreteClassB : AbstractClass { public override void PrimitiveOperation1() { Console.WriteLine("具體類B方法1的實現"); } public override void PrimitiveOperation2() { Console.WriteLine("具體類B方法2的實現"); } }
客戶端調用及結果:

AbstractClass ac; ac = new ConcreteClassA(); ac.TemplateMethod(); Console.WriteLine(""); ac = new ConcreteClassB(); ac.TemplateMethod();

三、實例說明
日常生活中做菜這件事,雖然做不同的菜的方式不一樣,但絕大多數步驟是一樣的,本例用炒菠菜和炒白菜作為實例進行說明模板方法模式,基本代碼如下:

public abstract class Vegetable { public void CookVegetable() { Console.WriteLine("燒蔬菜的一般方法:"); this.PoilOil(); this.HeatOil(); PourVegetable(); } public void PoilOil() { Console.WriteLine("倒油"); } public void HeatOil() { Console.WriteLine("把油燒熱"); } public abstract void PourVegetable(); } public class Spinach : Vegetable { public override void PourVegetable() { Console.WriteLine("菠菜倒進鍋中"); } } public class Cabbage : Vegetable { public override void PourVegetable() { Console.WriteLine("白菜倒進鍋中"); } }
客戶端調用及運行結果:
Vegetable sp = new Spinach(); sp.CookVegetable();

四、優(yōu)缺點及適用場景
優(yōu)點:
1)實現了代碼復用
2)能夠靈活應對子類步驟的變化,符合開放-封閉原則
缺點:
引入了一個抽象類,使系統邏輯更加復雜。
適用場景:
模板方法模式通過把不變的行為搬移到超類,去除子類中的重復代碼來體現其優(yōu)勢。因此凡是能體現此優(yōu)點的地方都可以使用模板方法模式。
新聞熱點
疑難解答