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