首页 > 代码库 > 模板设计方法——面条很香

模板设计方法——面条很香

    

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

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

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

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

变一个算法结构就可重新定义算法的某些特定步骤。

  看看模板方法的结构图:
                       


   理论总是需要实践去证明的,接下来就让我们以文章开头的大碗面为例,举例细说模板方法模式。 

   食堂的大碗面分有鸡排,排骨面等等,面的叫法不一样,但是做法一样,加的原料也差不多,葱,香菜,汤。唯

一的不同就是加排骨还是鸡排。

    来看看代码的实现:

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~