模板模式(Template): 提到模板,可能大多數人想到的是"簡歷模板"、"論文模板"等,比如我們要寫簡歷時,會從網上下載一份漂亮的簡歷模板,其格式是固定的,我們根據自己的情況填充不同的內容。模板模式定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可 ...
模板模式(Template):
提到模板,可能大多數人想到的是"簡歷模板"、"論文模板"等,比如我們要寫簡歷時,會從網上下載一份漂亮的簡歷模板,其格式是固定的,我們根據自己的情況填充不同的內容。模板模式定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。
模板模式的角色:
1)模板方法(AbstractClass):定義了一個或多個抽象操作,以便讓子類實現,這些抽象操作稱為基本操作;
2)模板方法的具體實現(ConcreteClass):實現父類所定義的一個或多個抽象方法。
上圖為java的UML圖,我們以該例子來寫我們的C#版本(玩游戲的步驟,初始化游戲-》開始游戲-》游戲結束)
1 internal class Program 2 { 3 private static void Main(string[] args) 4 { 5 Game game1 = new Cricket(); 6 game1.play(); 7 Game game2 = new Football(); 8 game2.play(); 9 } 10 } 11 12 internal abstract class Game 13 { 14 protected abstract void initialize(); 15 16 protected abstract void startPlay(); 17 18 protected abstract void endPlay(); 19 20 //模板 21 public void play() 22 { 23 //初始化游戲 24 initialize(); 25 26 //開始游戲 27 startPlay(); 28 29 //結束游戲 30 endPlay(); 31 } 32 } 33 34 internal class Cricket : Game 35 { 36 protected override void endPlay() 37 { 38 Console.WriteLine("Cricket Game Finished!"); 39 } 40 41 protected override void initialize() 42 { 43 Console.WriteLine("Cricket Game Initialized! Start playing."); 44 } 45 46 protected override void startPlay() 47 { 48 Console.WriteLine("Cricket Game Started. Enjoy the game!"); 49 } 50 } 51 52 internal class Football : Game 53 { 54 protected override void endPlay() 55 { 56 Console.WriteLine("Football Game Finished!"); 57 } 58 59 protected override void initialize() 60 { 61 Console.WriteLine("Football Game Initialized! Start playing."); 62 } 63 64 protected override void startPlay() 65 { 66 Console.WriteLine("Football Game Started. Enjoy the game!"); 67 } 68 }
模板模式的優缺點:
優點:
1)封裝不變部分,擴展可變部分,符合OCP原則;
2)提取公共代碼,便於維護;
3)行為由父類控制,子類實現。
缺點:每一個不同的實現都需要一個子類來實現,導致類的個數增加,使得系統更加龐大。
註意:一般模板方法定義成protected使得只有子類可以訪問他們。
參考:https://www.runoob.com/design-pattern/template-pattern.html