摘要:本文深入浅出的讲述了设计模式中的 模板 模式 , 并给出了简单的示例 , 例子浅显易懂 , 并附带源代码。
       模板模式属于行为型模式,其意图是定义一个操作的算法骨架,而将一些步骤延迟到子类中,可以不改变一个算法的结构即可以重新定义概算法的某些特定步骤。
       考虑一些提供了一个冒泡排序算法的类,其定义了冒泡算法的基本骨架:在这个算法中定义了两个抽象的操作swap(int)即交换两个元素的位置和outOforder(index)即当前的元素是否符合顺序。执行分类的方法,Dosort()调用了抽象的方法,执行既定的动作。在实现int类型的冒泡排序中,只要实现两个抽象的方法就可以通过调用Dosort来获取正确的结果。
适用性:
l          一次性实现一个算法的不变部分,并将可变的部分留给子类来实现,
l          各个子类中公共的行为应该被提取出来并集中到一个公共父类中以避免代码的重复。
l          控制子类的扩展,模板方法旨在特定点调用”hook”操作
参与者:
       AbstractClass(抽象类)
              定义抽象的原语操作,具体子类将重订一他们以实现一个算法的各个步骤,
              实现一个木板方法,定义一个算法的骨架,该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作。
              实现原语操作以完成算法中与特定子类相关的步骤。
       ConcreteClass(具体类)
              实现原语操作以完成算法中与特定子类相关的步骤。 
相互关系 : 具体类靠抽象类中的模板方法来完成算法中不变的部分。
模板方法导致一种反向的控制结构,即父类调用子类的方法。模板方法调用下列类型的操作:
具体的操作,具体的 AbstractClass 的操作,原语操作,钩子操作等。
以上的代码示例:
BubbleSorter 抽象类
package  template;
public   abstract   class  BubbleSorter{
     private   int   operations ;
     protected   int   length  = 0;
     protected   int  doSort(){// 掉用抽象方法
        operations  = 0;
        if ( length <=1) return   operations ;
        for  ( int  nextToLast =  length -2;nextToLast>=0;nextToLast--)
            for ( int  index = 0;index<=nextToLast;index++){
               if (outOfOrder(index)){
                  swap(index);
                   operations  ++;
              }
       }
        return   operations ;
    }
     protected   abstract   void  swap( int  index);// 定义的抽象方法
     protected   abstract   boolean  outOfOrder( int  index);
}
具体子类:
        package  template;
public   class  IntBubbleSorter  extends  BubbleSorter{
     private   int []  array ;
     public   int  sort( int [] array){
        this . array  = array;
        length  = array. length ;
        return  doSort();
    }
     protected   void  swap( int  index){
        int  temp =  array [index];
        array [index]= array [index+1];
        array [index+1]=temp;
    }
     protected   boolean  outOfOrder( int  index){
        return   array [index]> array [index+1];
    }
}
   
客户端的调用:
        package  template;
public   class  Client{
     public   static   void  main(String[] args){
        int [] intArray = {20,14,16,9,10,13,18};
        double [] dbArray = {20.50,20.43,20.88,20.45,20.72};
       IntBubbleSorter ibs =  new  IntBubbleSorter();
       ibs.sort(intArray);
       System. out .println( "Int sorter" );
        for ( int  i =0;i<intArray. length ;i++)
           System. out .print(intArray[i]+ "," );
       System. out .println();
       DoubleBubbleSorter dbs =  new  DoubleBubbleSorter();
       dbs.sort(dbArray);
       System. out .println( "Double sorter" );
        for ( int  i =0;i<dbArray. length ;i++)
           System. out .print(dbArray[i]+ "," );
       System. out .println();
    }
}
 
总结:模板方法在面向对象的设计中使用的比较多,概念理解也比较简单,在实际的应用中如果加以小心的求证,便可以灵活的掌握。