提到模板咱們常常會想到簡歷模板/PPT模板等,以簡歷模板爲例,不一樣的人可使用同樣的簡歷模板,在填充內容時根據本身的名字/工做經歷等填寫本身的內容,從而造成不一樣的簡歷。在OO中模板方法模式和現實中的模板十分類似,首先要有一個封裝了不可變部分的抽象類(簡歷的大體結構,都有姓名、性別、年齡、工做經歷等),而後將可變部分延遲到子類中(不一樣人的簡歷內容不一樣,這些不一樣的內容放在子類中實現),模板方法就是多態的一種實現。抽象類中模板方法不單單能夠定義內容的,也能夠定義執行的順序。ide
以遊戲廳打遊戲爲例,咱們去遊戲廳無論玩什麼遊戲均可以歸結爲四步:先投幣,遊戲初始化,玩遊戲,遊戲結束。這四步的順序是不變的,其中第一步是不能改變的,不管咱們玩什麼遊戲都要先投幣。咱們在代碼中來理解模板方法模式的用法。spa
抽象遊戲類和具體遊戲類:code
/// <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("三國無雙遊戲結束!"); } }
客戶端調用:blog
class Program { static void Main(string[] args) { //玩恐龍快打 Game klkdGame = new KLKDGame(); klkdGame.Play(); Console.WriteLine(); //玩三國無雙 Game sgwsGame = new SGWSGame(); sgwsGame.Play(); Console.ReadKey(); } }
運行程序:遊戲
在遊戲廳打遊戲的例子中,遊戲抽象類的Play方法就是模板方法,這個方法定義了玩遊戲的步驟,無論玩什麼遊戲都必須按照這個流程進行。string
上邊例子的類圖:it
模板方法模式的應用場景:模板
模板方法模式在抽象類中定義執行的方法和步驟,子類按需重寫各個步驟的方法,從而知足具體的需求。某些行爲能夠分步執行且執行的步驟固定時能夠考慮使用模板方法模式。class
模板方法模式的優勢:簡歷
模板方法的行爲由父類控制,子類實現,提取了公共代碼,便於維護。
模板方法模式的缺點:
每一種具體的實現都須要一個子類實現,可能會致使子類過多。