昨天晚上看了《舌尖上的中国2》第一集,特别的感人,尤其是看到帮别人割麦子的麦客,一亩地开价200,雇主只肯给100,脸上的那种纠结和无可奈何。还有长着大眼睛的跳跳鱼,很可爱,不过最终还是被水煮了,有点残忍,这也是自然的规律,个人感觉如果没到揭不开锅的地步的话,就少吃点这种可爱的生灵,你怎么对自然,自然也会怎么对你。
一、常规写法
言归正传,还是说到程序上,以前看了很多多态和开闭原则的理论,但一直不知道怎么用,或者说脑子里很糊涂,现在用美食帮助理解这两个点,如果我要根据菜名来显示配方,代码可能会这样写:
class Program { static void Main(string[] args) { Food f1 = Food.跳跳鱼红菇汤; ShowMaterial(f1); Food f2 = Food.歧山臊子面; ShowMaterial(f2); Food f3 = Food.四川泡菜; ShowMaterial(f3); Console.ReadLine(); } static void ShowMaterial(Food food) { switch (food) { case Food.跳跳鱼红菇汤: Console.WriteLine(string .Format("{0}食材:跳跳鱼、盐、豆腐、红菇。" , Food.跳跳鱼红菇汤.ToString())); break; case Food.歧山臊子面: Console.WriteLine(string .Format("{0}食材:五花肉、面、葱、姜、干辣椒面、五香粉、十三香、盐、鸡蛋、蒜苗。" , Food.歧山臊子面.ToString())); break; case Food .四川泡菜: Console.WriteLine(string .Format("{0}食材:萝卜、豇豆、包菜、盐、水、花椒、辣椒、姜、蒜。" , Food.四川泡菜.ToString())); break; } } enum Food { 跳跳鱼红菇汤, 歧山臊子面, 四川泡菜 } }
运行后屏幕显示:
跳跳鱼红菇汤食材:跳跳鱼、盐、豆腐、红菇。
歧山臊子面食材:五花肉、面、葱、姜、干辣椒面、五香粉、十三香、盐、鸡蛋、蒜苗。
四川泡菜食材:萝卜、豇豆、包菜、盐、水、花椒、辣椒、姜、蒜。
二、多态写法
现在这个程序也能跑起来了,不过如果我要添加“山东大煎饼”,就要修改Food枚举,还要在ShowMaterial方法再加个Switch分支,这里就违反了开闭(对扩展开放、对修改关闭)原则,好的设计应该是在不修改原来的代码上扩展新功能,用多态和开闭原则实现的新代码如下:
class Program { static void Main(string[] args) { Food f1 = new TiaoTiaoFish();//跳跳鱼 f1.ShowMaterial(); Food f2 = new SiChuanPaoCai();//泡菜 f2.ShowMaterial(); ShanDongBin bin = new ShanDongBin();//煎饼 bin.ShowMaterial(); Console.ReadLine(); } } abstract class Food { /// <summary> /// 食物名称 /// </summary> public string Name { get; set; } /// <summary> /// 显示食材的方法 /// </summary> public abstract void ShowMaterial(); } class TiaoTiaoFish : Food { public TiaoTiaoFish() : base() { Name = "跳跳鱼红菇汤" ; } public override void ShowMaterial() { Console.WriteLine(string .Format("{0}食材:跳跳鱼、盐、豆腐、红菇。" , Name)); } } class QiShanNoodle : Food { public QiShanNoodle() : base() { Name = "歧山臊子面" ; } public override void ShowMaterial() { Console.WriteLine(string .Format("{0}食材:五花肉、面、葱、姜、干辣椒面、五香粉、十三香、盐、鸡蛋、蒜苗。" , Name)); } } class SiChuanPaoCai : Food { public SiChuanPaoCai() : base() { Name = "四川泡菜" ; } public override void ShowMaterial() { Console.WriteLine(string .Format("{0}食材:萝卜、豇豆、包菜、盐、水、花椒、辣椒、姜、蒜a。" , Name)); } } class ShanDongBin : Food { public ShanDongBin() : base() { Name = "山东大煎饼" ; } public override void ShowMaterial() { Console.WriteLine(string .Format("{0}食材:杂粮煎饼、胡萝卜、香菜、香肠、葱花、榨菜、鸡蛋、甜面酱、芝麻酱。" , Name)); } }
运行后屏幕显示:
跳跳鱼红菇汤食材:跳跳鱼、盐、豆腐、红菇。
四川泡菜食材:萝卜、豇豆、包菜、盐、水、花椒、辣椒、姜、蒜。
山东大煎饼食材:杂粮煎饼、胡萝卜、香菜、香肠、葱花、榨菜、鸡蛋、甜面酱、芝麻酱
总结:
本人技术一般,不是不想写深点,只是太深的太理论的我写不出来,当然多态的知识太多太多,上面只是个人看到《舌尖2》后突然有感,才冒昧把食物和程序结合起来帮我理解多态和开闭原则,大神们不要笑我,我会继续努力的,也希望大家支持和推荐。
谢谢阅读。