在一个抽象类中定义一个操作中的算法骨架(对应于生活中的大家下载的模板),而将一些步骤延迟到子类中去实现(对应于我们根据自己的情况向模板填充内容)。模板方法使得子类可以不改变一个算法的结构前提下,重新定义算法的某些特定步骤,模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码。
抽象模板角色(Vegetable扮演这个角色):定义了一个或多个抽象操作,以便让子类实现,这些抽象操作称为基本操作。
具体模板角色(ChineseCabbage和Spinach扮演这个角色):实现父类所定义的一个或多个抽象方法。
员工上班遵循前往上班目的地,上班打卡,然后执行自己的工作,最后下班打卡的这样一个流程。
1 /// <summary> 2 /// 抽象上班模板 3 /// </summary> 4 public abstract class working 5 { 6 // 模板方法,不要把模版方法定义为Virtual或abstract方法,避免被子类重写,防止更改流程的执行顺序 7 public void Init(string name) 8 { 9 this.gotocompany(name); 10 this.clockin(name); 11 this.workings(name); 12 this.offduty(name); 13 } 14 15 /// <summary> 16 /// 去公司 17 /// </summary> 18 public abstract void gotocompany(string name); 19 20 /// <summary> 21 /// 打卡 22 /// </summary> 23 private void clockin(string name) 24 { 25 Console.WriteLine("员工:" + name + "上班打卡"); 26 } 27 28 /// <summary> 29 /// 开展自己的工作 30 /// </summary> 31 /// <param name="name"></param> 32 public abstract void workings(string name); 33 34 /// <summary> 35 /// 下班打卡 36 /// </summary> 37 /// <param name="name"></param> 38 private void offduty(string name) 39 { 40 Console.WriteLine("员工:" + name + "下班班打卡"); 41 } 42 }
1 /// <summary> 2 /// 员工A 3 /// </summary> 4 public class employeeA:working 5 { 6 public override void gotocompany(string name) 7 { 8 Console.WriteLine(name+"员工做地图前往公司"); 9 } 10 11 public override void workings(string name) 12 { 13 Console.WriteLine(name+"员工开展程序编码工作"); 14 } 15 }
1 /// <summary> 2 /// C#设计模式-模板方法模式 3 /// </summary> 4 class Program 5 { 6 static void Main(string[] args) 7 { 8 working w = new employeeA(); 9 w.Init("A"); 10 } 11 }
学习于 https://blog.csdn.net/heyangyi_19940703/article/details/51313934