首页 > 其他 > 详细

模板方法模式

时间:2014-03-29 15:39:08      阅读:392      评论:0      收藏:0      [点我收藏+]

    

 大家平时估计经常见自行车,今天就拿咱们生活中的自行车来开刀来谈一下自行车中

 

的模板。

 

 我们就先做一个基本的实现,能跑,能停,能响。如果不考虑扩展性的话,那么依照

 

经验最一般的类图来说如下:

 

bubuko.com,布布扣

 

 非常简单的实现, 自行车有两个型号,H1和H2,按照这种模型,我只要给你红旗牌模

 

型,先写个抽象类,然后不同型号模型的实现类,通过简单的继承就可以实现

 

我们的生产了,好了,那我们就先从抽象类开始编写。

 

 

 public abstract class HongQIModel
        {
            //首先,这个模型能够发动
            public abstract void start();
            //能发动,还能够停止
            public abstract void stop();

            //好屌啊,还可以响铃
            public abstract void alarm();

            //模型也应该会跑吧
            public abstract  void run();
           


        }



 

 

 在抽象类中,我们定义了红旗牌自行车都必须具有的特质,能够发动,停止,喇叭会

 

响,。但是每个型号的自行车实现是不同的,H1牌如下

 

 

public class H1:HongQIModel
        {
            //H1型号的自行车鸣笛
            public override void alarm()
            {
                Console.WriteLine("H1鸣笛");
            }


            //启动
            public override void start()
            {
                Console.WriteLine("H1启动");
            }

            //停止
            public override void stop()
            {
                Console.WriteLine("H1停车");
            }
            public override void run()
            {
                //先启动
                this.start();
                //我在响响铃
                this.alarm();
                //好了,跑累了,停止吧
                this.stop();
            }
          
        }



 

 

 大家看run()方法,这是一个汇总的方法,一个模型生产出来了,总该检测下吧!

 

“实践是检验真理的唯一标准”,是骡子,是马出来溜溜,让它跑起来,通过run()方

 

法,把模型的所有功能都测试到了

 

 

 在看H2模型代码 

 

  public class H2:HongQIModel
        {
             //H2型号的自行车鸣笛
            public override void alarm()
            {
                Console.WriteLine("H2鸣笛");
            }


            //启动
            public override void start()
            {
                Console.WriteLine("H2启动");
            }

            //停止
            public override void stop()
            {
                Console.WriteLine("H2停车");
            }

            public override void run()
            {
                //先启动
                this.start();
                //我在响响铃
                this.alarm();
                //好了,跑累了,停止吧
                this.stop();
            }
      
        }


 

 

 好了,看到这里,我们或许发现了什么问题,两个实现类中的run()方法都相同,因

此这个方法应该出现在抽象类,不应该在实现类上,抽象是所有子类的共同封装.

 

 

注意,在编码过程中,如果相同的代码出现过两次的话,就要对设计产生怀疑,分析为什么会这样】

 

 好了,既然发现问题了,那么我们就修改,修改后的类图与上面的一致,只不过抽象

 

类的代码进行了修改,如下

 

public abstract class HongQIModel
{
    //首先,这个模型能够发动
    public abstract void start();
    //能发动,还能够停止
    public abstract void stop();

    //好屌啊,还可以响铃
    public abstract void alarm();

    //模型也应该会跑吧
    public  void run()
    {
        //先启动
        this.start();
        //我在响响铃
        this.alarm();
        //好了,跑累了,停止吧
        this.stop();

    }



}


 


   在抽象红旗牌自行车上定义了run方法的规则,先启动,然后响铃,最后停止,那么它

 

的具体的两个实现类就不用再实现run方法了。我们来看客户端的代码

 

 

 static void Main(string[] args)
        {
            HongQIModel H1 = new H1();
            H1.run();
        }

 

 通过这样我们就定义了一个个自行车的模板,生产出没问题,并且可以运行起来判断

 

是不是有问题,这就是我们今天要说的模板方法
 

 

模板方法定义

   

 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一

 

个算法的结构即可以重定义该算法的某些特定步骤

 

   通用类图如下

bubuko.com,布布扣

   其中AbstractClass叫做抽象模板,它的方法分

 

为两类

      1.基本方法

      就是一些基本的操作,由子类实现,并且在

 

模板中被调用

      

 

      2.模板方法

      就是一个框架,完成就基本方法的调度

 

    下面是其基本的代码如下

 

抽象模板类

 

 public abstract class AbstractClass
       {
           //基本方法
           public abstract void doSomething();
           public abstract void doAnything();
           //模板方法
           public void templateMethod()
           {
               //调用基本方法,完成相关的逻辑
               this.doAnything();
               this.doSomething();
           }
       }


 

具体模板类

 

//具体模板类
        public class ConcreteClass1:AbstractClass
        {
            public override void doAnything()
            {
               
            }

            public override void doSomething()
            {
               
            }
        }


 

客户端代码

 

   static void Main(string[] args)
        {
            
            AbstractClass class1 = new ConcreteClass1();
            class1.templateMethod();
        }


 

 

 

 模板方法模式的应用

   优点

         

   封装不变部分,扩展可变部分

    

   通过上面的例子我们可以看出来,把共同的run要实现的部分,统一封装到了抽象类

 

中,我们想一想如果要增加一个H3牌的自行车,是不是特别容易,只需要增加一个子

 

类,实现父类的基本方法就可以了。

     

 

   行为由父类控制,子类实现

      

   我们看run()方法是不是由父类控制的呢,我们也完全更改运行的顺序,比如我们

 

可以先响铃,在启动等

 

 

 使用场景

    

    多个子类有公有的方法,并且逻辑基本相同时

    

    重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各

 

个类实现

 

 

      

 

 

 

模板方法模式,布布扣,bubuko.com

模板方法模式

原文:http://blog.csdn.net/luckyzhoustar/article/details/22177759

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!