模板模式(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