用《舌尖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》後忽然有感,才冒昧把食物和程序結合起來幫我理解多態和開閉原則,大神們不要笑我,我會繼續努力的,也但願你們支持和推薦。
謝謝閱讀。
相關文章
相關標籤/搜索