《设计模式》模板设计方法——面条很香

来源:互联网 发布:某酒店2000w数据.rar 编辑:程序博客网 时间:2024/04/28 20:17


    最近很喜欢吃面,今天一下课就又去吃面了。上次吃的排骨面,上上次吃的鸡排面,两个都好吃。其实吧,想想

这两唯一的区别就是加鸡排的就是鸡排面,加排骨就是排骨面。别的东西都一样。

    吃饱回来,继续学习大话设计模式之模板方法模式

    所谓的模板方法模式,就是定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法结构就可重新定义算法的某些特定步骤。

  看看模板方法的结构图:

                       


   理论总是需要实践去证明的,接下来就让我们以文章开头的大碗面为例,举例细说模板方法模式。 
   食堂的大碗面分有鸡排,排骨面等等,面的叫法不一样,但是做法一样,加的原料也差不多,葱,香菜,汤。唯
一的不同就是加排骨还是鸡排。
    来看看代码的实现:

abstract class Noodles //抽象面类    {public abstract void meat();        public abstract void soup();//抽象行为放到子类中去实现        public abstract void onion();        public abstract void coriander();    }    class ChickenNoodles : Noodles//鸡排面    {        public override void meat()        {           Console .WriteLine ( "加鸡排");        }        public override void soup()        {           Console .WriteLine("有汤");        }        public override void onion()        {          Console .WriteLine( "有葱");        }        public override void coriander()        {           Console .WriteLine("有香菜");        }    }    class SpareribsNoodles : Noodles//排骨面    {        public override void meat()        {            Console .WriteLine("加排骨");        }        public override void soup()        {            Console.WriteLine("有汤");        }        public override void onion()        {            Console.WriteLine("有葱");        }        public override void coriander()        {            Console.WriteLine("有香菜");        }    }

   上述代码,可以看出,两种面代码好多是重复的,所以应该修改代码,如下:


abstract class Noodles //抽象面类    {public abstract void meat();//抽象方法放到子类中去实现        public void soup()          {           Console.WriteLine("有汤");        }        public void onion()        {           Console.WriteLine("有葱");        }        public voidcoriander()        {           Console.WriteLine("有香菜");        }    }    class ChickenNoodles :Noodles//鸡排面    {        public override voidmeat()        {           Console .WriteLine ("加鸡排");        }            }    class SpareribsNoodles :Noodles//排骨面    {        public override voidmeat()        {            Console.WriteLine("加排骨");        }          }

       对比发现,修改之后的子类代码非常简单。相同操作的方法都在父类中去实现,子类中之存放不相同的方法。这里应该注意所有重复的代码都应该上升到父类中,而不是让每个子类都重复。

 

先看看整体结构图:

                   

      最后总结一下模板方法的特点:通过把不变的行为搬移到父类,去除子类中重复的代码来体现它的优势。 

       例子中的鸡排面和排骨面只因为加的肉不同而不同,所以子类中只有这个方法,别的方法都相同,所以都写到父类中。

       将学习和生活结合起来,学习将更高效和搞笑O(_)O~

  
4 0