C#设计模式---模板方法模式(Template Method Pattern)

一、目的

模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码。

二、定义

模板方法模式:在一个抽象类中定义一个操作的算法骨架,将算法骨架中某些特定的操作延迟到子类中实现。

模板方法使得子类在不改变一个算法骨架的前提下,重新定义算法的某些特定步骤。

三、场景

现实生活中,我们炒菜一般遵循一个特定的步骤,无论炒什么菜,基本步骤是一样的,只是菜品不一样而已,下面我我们用模板方法模式来模拟这一场景。

四、实现

 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 }
View Code

 

运行结果如下:

五、类图

 

posted on 2018-09-08 17:25  缘惜  阅读(190)  评论(0编辑  收藏  举报