用《舌尖2》去理解C#中的多态和开闭原则

昨天晚上看了《舌尖上的中国2》第一集,特别的感人,尤为是看到帮别人割麦子的麦客,一亩地开价200,雇主只肯给100,脸上的那种纠结和迫不得已。还有长着大眼睛的跳跳鱼,很可爱,不过最终仍是被水煮了,有点残忍,这也是天然的规律,我的感受若是没到揭不开锅的地步的话,就少吃点这种可爱的生灵,你怎么对天然,天然也会怎么对你。

1、常规写法

言归正传,仍是说到程序上,之前看了不少多态和开闭原则的理论,但一直不知道怎么用,或者说脑子里很糊涂,如今用美食帮助理解这两个点,若是我要根据菜名来显示配方,代码可能会这样写:
 
 1 class Program
 2       {
 3             static void Main(string[] args)
 4             {
 5                   Food f1 = Food.跳跳鱼红菇汤;
 6                   ShowMaterial(f1);
 7  
 8                   Food f2 = Food.歧山臊子面;
 9                   ShowMaterial(f2);
10  
11                   Food f3 = Food.四川泡菜;
12                   ShowMaterial(f3);
13  
14                   Console.ReadLine();
15             }
16  
17             static void ShowMaterial(Food food)
18             {
19                   switch (food)
20                   {
21                          case Food.跳跳鱼红菇汤:
22                                Console.WriteLine(string .Format("{0}食材:跳跳鱼、盐、豆腐、红菇。" , Food.跳跳鱼红菇汤.ToString()));
23                                break;
24                          case Food.歧山臊子面:
25                                Console.WriteLine(string .Format("{0}食材:五花肉、面、葱、姜、干辣椒面、五香粉、十三香、盐、鸡蛋、蒜苗。" , Food.歧山臊子面.ToString()));
26                                break;
27                          case Food .四川泡菜:
28                                Console.WriteLine(string .Format("{0}食材:萝卜、豇豆、包菜、盐、水、花椒、辣椒、姜、蒜。" , Food.四川泡菜.ToString()));
29                                break;
30                   }
31             }
32  
33             enum Food
34             {
35                   跳跳鱼红菇汤,
36                   歧山臊子面,
37                   四川泡菜
38             }
39       }

运行后屏幕显示:ide

跳跳鱼红菇汤食材:跳跳鱼、盐、豆腐、红菇。
歧山臊子面食材:五花肉、面、葱、姜、干辣椒面、五香粉、十三香、盐、鸡蛋、蒜苗。
四川泡菜食材:萝卜、豇豆、包菜、盐、水、花椒、辣椒、姜、蒜。

 2、多态写法

如今这个程序也能跑起来了,不过若是我要添加“山东大煎饼”,就要修改Food枚举,还要在ShowMaterial方法再加个Switch分支,这里就违反了开闭(对扩展开放、对修改关闭)原则,好的设计应该是在不修改原来的代码上扩展新功能,用多态和开闭原则实现的新代码以下:
 
 1 class Program
 2       {
 3             static void Main(string[] args)
 4             {
 5                   Food f1 = new TiaoTiaoFish();//跳跳鱼
 6                   f1.ShowMaterial();
 7  
 8                   Food f2 = new SiChuanPaoCai();//泡菜
 9                   f2.ShowMaterial();
10  
11                   ShanDongBin bin = new ShanDongBin();//煎饼
12                   bin.ShowMaterial();
13  
14                   Console.ReadLine();
15             }
16       }
17  
18       abstract class Food
19       {
20              /// <summary>
21              /// 食物名称
22              /// </summary>
23              public string Name { get; set; }
24  
25              /// <summary>
26              /// 显示食材的方法
27              /// </summary>
28              public abstract void ShowMaterial();
29       }
30  
31       class TiaoTiaoFish : Food
32       {
33             public TiaoTiaoFish()
34                   : base()
35             {
36                   Name = "跳跳鱼红菇汤" ;
37             }
38  
39             public override void ShowMaterial()
40             {
41                    Console.WriteLine(string .Format("{0}食材:跳跳鱼、盐、豆腐、红菇。" , Name));
42             }
43       }
44  
45       class QiShanNoodle : Food
46       {
47             public QiShanNoodle()
48                   : base()
49             {
50                   Name = "歧山臊子面" ;
51             }
52             public override void ShowMaterial()
53             {
54                    Console.WriteLine(string .Format("{0}食材:五花肉、面、葱、姜、干辣椒面、五香粉、十三香、盐、鸡蛋、蒜苗。" , Name));
55             }
56       }
57  
58       class SiChuanPaoCai : Food
59       {
60             public SiChuanPaoCai()
61                   : base()
62             {
63                   Name = "四川泡菜" ;
64             }
65             public override void ShowMaterial()
66             {
67                    Console.WriteLine(string .Format("{0}食材:萝卜、豇豆、包菜、盐、水、花椒、辣椒、姜、蒜a。" , Name));
68             }
69       }
70  
71       class ShanDongBin : Food
72       {
73             public ShanDongBin()
74                   : base()
75             {
76                   Name = "山东大煎饼" ;
77             }
78             public override void ShowMaterial()
79             {
80                    Console.WriteLine(string .Format("{0}食材:杂粮煎饼、胡萝卜、香菜、香肠、葱花、榨菜、鸡蛋、甜面酱、芝麻酱。" , Name));
81             }
82       }
运行后屏幕显示:
跳跳鱼红菇汤食材:跳跳鱼、盐、豆腐、红菇。
四川泡菜食材:萝卜、豇豆、包菜、盐、水、花椒、辣椒、姜、蒜。
山东大煎饼食材:杂粮煎饼、胡萝卜、香菜、香肠、葱花、榨菜、鸡蛋、甜面酱、芝麻酱 

总结: 

本人技术通常,不是不想写深点,只是太深的太理论的我写不出来,固然多态的知识太多太多,上面只是我的看到《舌尖2》后忽然有感,才冒昧把食物和程序结合起来帮我理解多态和开闭原则,大神们不要笑我,我会继续努力的,也但愿你们支持和推荐。
谢谢阅读。
相关文章
相关标签/搜索