1.概念
定义一个类中算法的框架,实现部分算法,其他算法延迟到子类中,使得子类可以在不改变算法结构的基础上重定义算法中的特定步骤;模板方法经常用来搭建框架,比如架构师实现某些重要的功能,然后未实现的交给初级开发来完成;
2.使用例子
场景:一天,程序员A拿到一个任务需要给一个数组进行排序并打印出来;这个任务可以分解成两个部分,排序和打印,打印功能比较容易,所以A考虑把打印功能完成,之后排序功能交给其他人来做;于是他先定义了一个抽象类,实现了打印的逻辑,然后定义了抽象的排序方法
abstract class AbstractSort {
/**
* 将数组array由小到大排序
* @param array
*/
protected abstract void sort(int[] array);
public void showSortResult(int[] array){
this.sort(array);
System.out.print("排序结果:");
for (int i = 0; i < array.length; i++){
System.out.printf("%3s", array[i]);
}
}
}
写完之后,A找到入职不久的B说,有个功能需要你来实现下,主要逻辑都写好了;于是B直接在A的基础上写抽象方法的实现就好了
class ConcreteSort extends AbstractSort {
@Override
protected void sort(int[] array){
for(int i=0; i<array.length-1; i++){
selectSort(array, i);
}
}
private void selectSort(int[] array, int index) {
int MinValue = 32767; // 最小值变量
int indexMin = 0; // 最小值索引变量
int Temp; // 暂存变量
for (int i = index; i < array.length; i++) {
if (array[i] < MinValue){ // 找到最小值
MinValue = array[i]; // 储存最小值
indexMin = i;
}
}
Temp = array[index]; // 交换两数值
array[index] = array[indexMin];
array[indexMin] = Temp;
}
}
大部分刚步入职场的毕业生应该都有类似B的经历。一个复杂的任务,由公司中的牛人们将主要的逻辑写好,然后把那些看上去比较简单的方法写成抽象的,交给其他的同事去开发。这种分工方式在编程人员水平层次比较明显的公司中经常用到。比如一个项目组,有架构师,高级工程师,初级工程师,则一般由架构师使用大量的接口、抽象类将整个系统的逻辑串起来,实现的编码则根据难度的不同分别交给高级工程师和初级工程师来完成。怎么样,是不是用到过模版方法模式?
主要结构:
模板方法由一个抽象类和一个或者几个实现类通过继承结构组成;抽象类中的方法分成三种
1>抽象方法:父类中声明不实现,而是定义好规范,由子类去实现;
2>模板方法:抽象类声明并加以实现,一般来说,模板方法会调用抽象方法完成主要的逻辑,并且模板方法会定义成final的,指明主要的逻辑在子类中是不能重写的;
3>钩子方法:抽象类声明并加以实现的;但是子类可以去扩展;
抽象类的任务是搭建逻辑的框架,通常由经验丰富的开发编写,因为抽象类的好坏决定了程序的稳定性;