定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的接口即可重定义改算法中的某些特定步骤。
模板模式由一个抽象类和一个(一组)具体实现类组成。
抽象类中的三种方法:
1、抽象方法:在抽象类中定义相应的规范,由具体的实现类进行相应的实现。(一般由抽象方法完成主要的逻辑功能)
2、模板方法:在抽象类中声明并且进行实现。一般来说模板方法会被定义为final的方法,防止在具体类中被重写。
3、钩子方法:在首相类中进行声明并且实现,但是子类可以进行重写,扩展钩子方法来影响抽象类的逻辑。
抽象类的主要作用就是进行搭建业务的逻辑框架,一般都是由经验丰富的人完成。
程序员A拿到一个任务,对一组数组的数据数据进行排序并且进行打印。
分析:此次任务主要分为两步,一步就是对数据进行排序,另外一步就是进行打印排序后的数据。模板模式用于此,架构师负责将架构搭建,然后根据逻辑的复杂程度分配给初、中、高工程师。
抽象类:AbstractSort
package com.golf.module; ? //对一个数组进行排序和打印 public abstract class AbstractSort { //抽象类中的抽象方法 public abstract int[] sortArray(int array[],int low,int high); //抽象类的模板方法 public final void printArray(int array[]){ int[] arr = sortArray(array,0,array.length-1); for(int i=0;i<arr.length;i++){ System.out.println(arr[i]); } } ? } ?
具体实现类:
package com.golf.module; ? //具体实现类 public class Sort extends AbstractSort{ ? //使用快速排序 @Override public int[] sortArray(int[] array, int low, int high) { if(low >high) return array; //将最左边的值存放到中间变量 int temp = array[low]; int i = low; int j = high; while(array[j]>=temp && i<j){ //从数组的最右边开始查看小于temp值 j--; } array[i] = array[j]; //找到右边比temp小的值 给最左边 ? while(array[i] <= temp && i<j){ //从数组的左边开始找大于temp值的 i++; } array[j] = array[i]; //将左边比temp值大的放到右边 ? array[i] = temp; //基准值 ? sortArray(array,low,j-1); //调用左半边数组 sortArray(array,j+1,high); //调用右半边数组 ? return array; } } ?
客户端:
package com.golf.module; ? public class Client { public static void main(String[] args) { int arr[] = {2,1,4,5,23,13,41,56}; AbstractSort abstractSort = new Sort(); abstractSort.printArray(arr); } }
?
优点:
1、容易扩展,可以通过实现抽象方法,从而对功能进行扩展。符合开放-封闭原则。
原文:https://www.cnblogs.com/bm654/p/11981409.html