模板方法模式——在一个抽象类中定义一个操作中的算法骨架,而将一些步骤延迟到子类中去实现(对应于我们根据自己的情况向模板填充内容)。模板方法使得子类可以不改变一个算法的结构前提下,重新定义算法的某些特定步骤,模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码。
优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
1 /// <summary> 2 /// 炒菜基类 3 /// </summary> 4 public abstract class CookAbstract 5 { 6 /// <summary> 7 /// 模板方法 8 /// </summary> 9 public void Cook() 10 { 11 AddOil(); 12 AddVegetables(); 13 AddSalt(); 14 } 15 16 /// <summary> 17 /// 加油 18 /// </summary> 19 public virtual void AddOil() 20 { 21 Console.WriteLine("加油"); 22 } 23 /// <summary> 24 /// 加蔬菜 25 /// </summary> 26 public abstract void AddVegetables(); 27 /// <summary> 28 /// 加盐 29 /// </summary> 30 public virtual void AddSalt() 31 { 32 Console.WriteLine("加盐"); 33 } 34 }
1 /// <summary> 2 /// 炒土豆 3 /// </summary> 4 public class CookPotato : CookAbstract 5 { 6 public override void AddVegetables() 7 { 8 Console.WriteLine("加土豆"); 9 } 10 } 11 /// <summary> 12 /// 炒白菜 13 /// </summary> 14 public class CookCabbage : CookAbstract 15 { 16 public override void AddOil() 17 { 18 Console.WriteLine("加花生油"); 19 } 20 public override void AddVegetables() 21 { 22 Console.WriteLine("加白菜"); 23 } 24 }
1 CookAbstract potato = new CookPotato(); 2 CookAbstract cabbage = new CookCabbage(); 3 4 potato.Cook(); 5 Console.WriteLine(); 6 cabbage.Cook();
结果: