模板模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
比如定义一个操作中的算法的骨架,将步骤延迟到子类中。模板方法使得子类能够不去改变一个算法的结构即可重定义算法的某些特定步骤。
模式中的角色
抽象类(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 /