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


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

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

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

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

  看看模板方法的结构图:

                       


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

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("加排骨");
        }
      
    }

       对照发现,改动之后的子类代码很easy。同样操作的方法都在父类中去实现,子类中之存放不同样的方法。这里应该注意全部反复的代码都应该上升到父类中,而不是让每一个子类都反复。

 

先看看总体结构图:

                   

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

       样例中的鸡排面和排骨面仅仅由于加的肉不同而不同,所以子类中仅仅有这种方法,别的方法都同样,所以都写到父类中。

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

  
posted @ 2014-07-26 22:25  mengfanrong  阅读(175)  评论(0编辑  收藏  举报