你去銀行取款的時候,銀行會給你一張取款單,這張取款單就是一個模板,它把公共的內容提取到模板中,只留下部分讓用戶來填寫。在軟件系統中,將多個類的共有內容提取到一個模板中的思想便是模板方法模式的思想。
模板方法模式是基於繼承的代碼復用基本技術,在模板方法模式中,可以將相同的代碼放在父類中,而將不同的方法實現放在不同的子類中。
在模板方法模式中,需要准備一個抽象類,將部分邏輯以具體方法以及具體構造函數形式實現,然后聲明一些抽象方法來讓子類實現剩余邏輯。不同的子類可以以不同的方式實現這些抽象方法。
1.1>、定義
定義一個操作中算法的骨架,將這些步驟延遲到子類中。模板方法模式使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
1.2>、使用頻率
中等
2、模板方法模式結構
2.1>、結構圖

2.2>、參與者
模板方法模式參與者:
◊ AbstractClass:定義一個模板,其子類將重定義PrimitiveOperation1和PrimitiveOperation2操作。
◊ ConcreteClass:實現PrimitiveOperation1和PrimitiveOperation2以完成算法中與特定子類(Client)相關的內容。
在模板方法模式中,AbstractClass中的TemplateMethod提供了一個標准模板,該模板包含PrimitiveOperation1和PrimitiveOperation2兩個方法,這兩個方法的內容Client可以根據自己的需要重寫。
3、模板方法模式結構實現

AbstractClass.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.TemplateMethodPattern.Structural { public abstract class AbstractClass { public abstract void PrimitiveOperation1(); public abstract void PrimitiveOperation2(); /// <summary> /// The "Template method" /// </summary> public void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); Console.WriteLine(""); } } }
ConcreteClassA.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.TemplateMethodPattern.Structural { public class ConcreteClassA : AbstractClass { public override void PrimitiveOperation1() { Console.WriteLine("ConcreteClassA.PrimitiveOperation1()"); } public override void PrimitiveOperation2() { Console.WriteLine("ConcreteClassA.PrimitiveOperation2()"); } } }
ConcreteClassB.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatterns.TemplateMethodPattern.Structural { public class ConcreteClassB : AbstractClass { public override void PrimitiveOperation1() { Console.WriteLine("ConcreteClassB.PrimitiveOperation1()"); } public override void PrimitiveOperation2() { Console.WriteLine("ConcreteClassB.PrimitiveOperation2()"); } } }
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DesignPatterns.TemplateMethodPattern.Structural; namespace DesignPatterns.TemplateMethodPattern { class Program { static void Main(string[] args) { AbstractClass aA = new ConcreteClassA(); aA.TemplateMethod(); AbstractClass aB = new ConcreteClassB(); aB.TemplateMethod(); } } }
運行輸出:
ConcreteClassA.PrimitiveOperation1()
ConcreteClassA.PrimitiveOperation2()
ConcreteClassB.PrimitiveOperation1()
ConcreteClassB.PrimitiveOperation2()
請按任意鍵繼續. . .
4、模板方法模式應用分析
模板方法模式適用情形:
◊ 一次性實現一個算法的不變部分,並將可變的行為留給子類來實現。
◊ 各子類中公共的行為應被提取出來並集中到一個公共父類中以避免代碼重復。
◊ 控制子類擴展。模板方法只允許在特定點進行擴展,而模板部分則是穩定的。
模板方法模式特點:
◊ TemplateMethod模式是一種非常基礎性的設計模式,在面向對象系統中大量應用。它用最簡潔的機制(基礎、多態)為很多應用程序框架提供了靈活的擴展點,是代碼復用方面的基本實現結構。
◊ 在具體實現方面,被TemplateMethod調用的虛方法可以具有實現,也可以沒有任何實現(抽象方法或虛方法)。但一般推薦將它們設置為protected方法使得只有子類可以訪問它們。
◊ 模板方法模式通過對子類的擴展增加新的行為,符合“開閉原則”。
