一、目的
模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码。
二、定义
模板方法模式:在一个抽象类中定义一个操作的算法骨架,将算法骨架中某些特定的操作延迟到子类中实现。
模板方法使得子类在不改变一个算法骨架的前提下,重新定义算法的某些特定步骤。
三、场景
现实生活中,我们炒菜一般遵循一个特定的步骤,无论炒什么菜,基本步骤是一样的,只是菜品不一样而已,下面我我们用模板方法模式来模拟这一场景。
四、实现
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignMode_TemplateMethod 8 { 9 public abstract class CookVegetable 10 { 11 // 模板方法,不要把模版方法定义为Virtual或abstract方法,避免被子类重写,防止更改流程的执行顺序 12 public void CookVegetableTemplate() 13 { 14 Console.WriteLine("炒蔬菜的模板方法"); 15 PourOil(); 16 HeatOil(); 17 PourVegetable();//放入何种蔬菜由具体的子类决定 18 PourSalt(); 19 StirFry(); 20 } 21 22 public void PourOil() 23 { 24 Console.WriteLine("往锅里倒油"); 25 } 26 public void HeatOil() 27 { 28 Console.WriteLine("把油加热"); 29 } 30 31 // 油热了之后倒蔬菜下去,具体哪种蔬菜由子类决定 32 public abstract void PourVegetable(); 33 34 public void PourSalt() 35 { 36 Console.WriteLine("放入精盐"); 37 } 38 public void StirFry() 39 { 40 Console.WriteLine("翻炒"); 41 } 42 } 43 44 public class CookCabbage : CookVegetable 45 { 46 public override void PourVegetable() 47 { 48 Console.WriteLine("倒入大白菜"); 49 50 } 51 } 52 public class CookPotato : CookVegetable 53 { 54 public override void PourVegetable() 55 { 56 Console.WriteLine("倒入马铃薯"); 57 } 58 } 59 class Program 60 { 61 static void Main(string[] args) 62 { 63 CookPotato cookPotato = new CookPotato(); 64 CookCabbage cookCabbage = new CookCabbage(); 65 66 cookPotato.CookVegetableTemplate(); 67 Console.WriteLine("********************"); 68 cookCabbage.CookVegetableTemplate(); 69 70 Console.ReadLine(); 71 } 72 } 73 }
运行结果如下:
五、类图