1、C#設計模式-模板方法模式
模板方法模式:提到模板我們經常會想到簡歷模板/PPT模板等,以簡歷模板爲例,不同的人可以使用一樣的簡歷模板,在填充內容時根據自己的名字/工作經歷等填寫自己的內容,從而形成不同的簡歷。在OO中模板方法模式和現實中的模板十分相似,首先要有一個封裝了不可變部分的抽象類(簡歷的大致結構,都有姓名、性別、年齡、工作經歷等),然後將可變部分延遲到子類中(不同人的簡歷內容不同,這些不同的內容放在子類中實現),模板方法就是多態的一種實現。抽象類中模板方法不僅僅可以定義內容的,也可以定義執行的順序。
2、案例場景-(來自生活場景【釣魚】)
以釣魚爲例,我們去釣魚不管釣什麼魚都可以歸結爲四步:裝餌料,下竿,中魚。這三步的順序是不變的,其中第一步是不能改變的,無論我們不管釣什麼魚都要先有餌料。我們在代碼中來理解模板方法模式的用法。
定義抽象模板類:
public abstract class Gofish { public abstract void DownFood();//裝餌料 public abstract void WaitFish();//等待 public abstract void UpFish();//上魚 public void GoFishProcess() { DownFood(); WaitFish(); UpFish(); } }
然後定義子類,繼續模板父類
public class FishManA : Gofish { public override void DownFood() { Console.WriteLine("釣魚人A——上餌料"); } public override void WaitFish() { Console.WriteLine("釣魚人A——等魚咬鉤"); } public override void UpFish() { Console.WriteLine("釣魚人A——上魚了"); } }
public class FishManB : Gofish { public override void DownFood() { Console.WriteLine("FishManB_上餌料"); } public override void WaitFish() { Console.WriteLine("FishManB_等魚兒咬鉤"); } public override void UpFish() { Console.WriteLine("FishManB_馬上上魚"); } }
釣魚人A,B充當子類,分別繼承重寫父類的模板方法;
抽象方法定義在抽象產品類,子類AB充當具體產品類。並且實現父類的抽象方法;
調用執行:
static void Main(string[] args) { Gofish gf = new FishManA(); //gf.GoFishProcess(); FishManA fm = new FishManA(); fm.GoFishProcess(); FishManB fmb = new FishManB(); fmb.GoFishProcess(); Console.ReadKey(); }
模板方法模式的應用場景:
模板方法模式在抽象類中定義執行的方法和步驟,子類按需重寫各個步驟的方法,從而滿足具體的需求。某些行爲可以分步執行且執行的步驟固定時可以考慮使用模板方法模式。
模板方法模式的優點:
模板方法的行爲由父類控制,子類實現,提取了公共代碼,便於維護。
模板方法模式的缺點:
每一種具體的實現都需要一個子類實現,可能會導致子類過多。
個人V:zp2013822 歡迎交流