模板方法:定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使的子类可以不可以一个算法的结构即可重定该算法的某些特定步骤。
简单点说:有一组流程要执行,流程中只有一个步骤是未知的,它前后的其余步骤都是固定的,我们就将这一步骤延迟到具体的子类去实现,以达到通用代码的抽象封装。
假设有一个考试的父类:
/**
* 考试
* @author PC
*
*/
public abstract class Exam {
/**
* 考试
*/
public final void exam(){
enter();
startExam();
exit(); }
/**
* 进入考场
*/
protected void enter() {
System.out.println("进入考场..");
}
/**
* 具体进行考试
*/
protected abstract void startExam() ;
/**
* 离开考场
*/
protected void exit(){
System.out.println("离开考场...");
}
}
进入考场和离开考场是所有考试行为的通用逻辑,而具体是考什么试,如何考得根据具体子类去决定,
假如是学生的话:
/**
* 学生考试
* @author PC
*
*/
public class Student extends Exam{
@Override
protected void startExam() {
System.out.println("学生考试做卷子..");
}
}
假如是考驾照的话 :
/**
* 考驾照
* @author PC
*
*/
public class License extends Exam{
@Override
protected void startExam() {
System.out.println("开始开车过关..");
}
}
public class Client {
public static void main(String[] args) {
new Student().exam();
new License().exam();
}
}
结果:
进入考场..
学生考试做卷子..
离开考场...
进入考场..
开始开车过关..
离开考场...
有人可能会疑惑:那这个模板方法和上次的工厂方法或者抽象工厂有什么区别。。?感觉都是定义了个抽象方法,让子类去实现。
区别:
模板方法侧重的是在一个固定的执行流程中,其中的一步让子类去实现,侧重执行流程,比如Activity的onCreate,onStart等方法。
工厂方法和抽象工厂都是侧重创建对象。