模板模式是類的行為模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,然后聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。這就是模板方法模式的用意。
比如定義一個操作中的算法的骨架,將步驟延遲到子類中。模板方法使得子類能夠不去改變一個算法的結構即可重定義算法的某些特定步驟。
模式中的角色
抽象類(AbstractClass):實現了模板方法,定義了算法的骨架。
具體類(ConcreteClass):實現抽象類中的抽象方法,已完成完整的算法。
經典代碼:
abstract class SortTemplate {public void showSortResult(int[] arr) {sort(arr);for(int x:arr) {System.out.print( x + " / ");}System.out.println();}public abstract void sort(int[] arr);
}class BubbleSort extends SortTemplate {public void sort(int[] arr) {System.out.println("冒泡排序:");for(int i=0;i<arr.length-1;i++){for(int j=0;j<arr.length-1-i;j++){if(arr[j]>arr[j+1]){int temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}
}class SelectSort extends SortTemplate{public void sort(int[] arr){System.out.println("選擇排序:");for(int i=0;i<arr.length-1;i++){for(int j=i+1;j<arr.length;j++){if(arr[i]>arr[j]){int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}}}}
}class QuickSort extends SortTemplate{public void sort(int[] arr){System.out.println("快速排序:");quickSort(arr,0,arr.length-1);}public void quickSort(int[] arr,int left,int right){if(left<right){int i=left,j=right,x=arr[left];while(i<j){while(i<j&&arr[j]>=x)j--;if(i<j){arr[i++]=arr[j];}while(i<j&&arr[i]<x)i++;if(i<j){arr[j--]=arr[i];}}arr[i]=x;quickSort(arr,left,i-1);quickSort(arr,i+1,right);}}
}class TemplateDemo{public static void main(String[] args) {int[] arr1 = {44,44,2,32,54,22,88,77,99,11};int[] arr2 = {34,32,6,12,98,34,81,30,1,45};int[] arr3 = {73,5,19,40,99,20,12,48,28,64,308,23};SortTemplate st = new BubbleSort();st.showSortResult(arr1);st = new SelectSort();st.showSortResult(arr2);st = new QuickSort();st.showSortResult(arr3);}
}
運行結果:
冒泡排序:
2 / 11 / 22 / 32 / 44 / 44 / 54 / 77 / 88 / 99 /
選擇排序:
1 / 6 / 12 / 30 / 32 / 34 / 34 / 45 / 81 / 98 /
快速排序:
5 / 12 / 19 / 20 / 23 / 28 / 40 / 48 / 64 / 73 / 99 / 308 /
2 / 11 / 22 / 32 / 44 / 44 / 54 / 77 / 88 / 99 /
選擇排序:
1 / 6 / 12 / 30 / 32 / 34 / 34 / 45 / 81 / 98 /
快速排序:
5 / 12 / 19 / 20 / 23 / 28 / 40 / 48 / 64 / 73 / 99 / 308 /