出處:https://www.cnblogs.com/wyy1234/
閱讀目錄
1.模板方法模式介紹
提到模板我們經常會想到簡歷模板/PPT模板等,以簡歷模板為例,不同的人可以使用一樣的簡歷模板,在填充內容時根據自己的名字/工作經歷等填寫自己的內容,從而形成不同的簡歷。在OO中模板方法模式和現實中的模板十分相似,首先要有一個封裝了不可變部分的抽象類(簡歷的大致結構,都有姓名、性別、年齡、工作經歷等),然后將可變部分延遲到子類中(不同人的簡歷內容不同,這些不同的內容放在子類中實現),模板方法就是多態的一種實現。抽象類中模板方法不僅僅可以定義內容的,也可以定義執行的順序。
以游戲廳打游戲為例,我們去游戲廳不管玩什么游戲都可以歸結為四步:先投幣,游戲初始化,玩游戲,游戲結束。這四步的順序是不變的,其中第一步是不能改變的,無論我們玩什么游戲都要先投幣。我們在代碼中來理解模板方法模式的用法。
抽象游戲類和具體游戲類:
/// <summary>
/// 抽象游戲類
/// </summary>
public abstract class Game
{
//每款游戲都要投幣,子類不能重寫
public void InsertCoins()
{
Console.WriteLine("往游戲機里投幣...");
}
public abstract void InitGame();
public abstract void StartGame();
public abstract void EndGame();
//Play是模板方法,定義了子類執行的步驟
public void Play()
{
//投幣
InsertCoins();
//初始化游戲
InitGame();
//游戲開始
StartGame();
//游戲結束
EndGame();
}
}
/// <summary>
/// 恐龍快打游戲
/// </summary>
public class KLKDGame : Game
{
public override void InitGame()
{
Console.WriteLine("初始化恐龍快打游戲..");
}
public override void StartGame()
{
Console.WriteLine("開始玩恐龍快打游戲..");
}
public override void EndGame()
{
Console.WriteLine("恐龍快打游戲結束!");
}
}
/// <summary>
/// 三國無雙游戲
/// </summary>
public class SGWSGame : Game
{
public override void InitGame()
{
Console.WriteLine("初始化三國無雙..");
}
public override void StartGame()
{
Console.WriteLine("開始玩三國無雙..");
}
public override void EndGame()
{
Console.WriteLine("三國無雙游戲結束!");
}
}
客戶端調用:
class Program
{
static void Main(string[] args)
{
//玩恐龍快打
Game klkdGame = new KLKDGame();
klkdGame.Play();
Console.WriteLine();
//玩三國無雙
Game sgwsGame = new SGWSGame();
sgwsGame.Play();
Console.ReadKey();
}
}
運行程序:

在游戲廳打游戲的例子中,游戲抽象類的Play方法就是模板方法,這個方法定義了玩游戲的步驟,不管玩什么游戲都必須按照這個流程進行。
2.小結
上邊例子的類圖:

模板方法模式的應用場景:
模板方法模式在抽象類中定義執行的方法和步驟,子類按需重寫各個步驟的方法,從而滿足具體的需求。某些行為可以分步執行且執行的步驟固定時可以考慮使用模板方法模式。
模板方法模式的優點:
模板方法的行為由父類控制,子類實現,提取了公共代碼,便於維護。
模板方法模式的缺點:
每一種具體的實現都需要一個子類實現,可能會導致子類過多。

