1.定义
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2.UML图
AbstractClass是抽象类,其实就是一个抽象模板,它定义并实现了一个模板方法。该模板方法一般是一个具体方法,给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。
abstract class AbstractClass{
//一些抽象行为放到子类中去实现
public abstract void primitiveOperation1();
public abstract void primitiveOperation2();
//模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们都推迟到子类中实现
public void templateMethod(){
primitiveOperation1();
primitiveOperation2();
System.out.println("");
}
}
ConcreteClass,实现父类所定义的一个或多个抽象方法。每一个ConcreteClass都可以给出这些抽象方法(顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。
class ConcreteClassA extends AbstractClass{
@Override
public void primitiveOperation1(){
System.out.println("具体类A方法1实现");
}
@Override
public void primitiveOperation2(){
System.out.println("具体类A方法2实现");
}
}
class ConcreteClassB extends AbstractClass{
@Override
public void primitiveOperation1(){
System.out.println("具体类B方法1实现");
}
@Override
public void primitiveOperation2(){
System.out.println("具体类B方法2实现");
}
}
3.模板方法特点
关键理解点:所谓模板即可以看成是我们把不变的步骤抽象到超类等高级层次,详细的实现步骤交给子类去。好比你乘坐交通工具,都要有的步骤就是:买票-验票-上交通工具-到达目的地。但是我买票是买的火车票还是飞机票还是船票就不属于我超类该考虑的了。
书中讲到,当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,进而帮助子类摆脱重复的不变行为的纠缠。
4.Android源码中的模板方法模式
Android中,AsyncTask是常用的一个。该类使用的正是模板方法模式。
使用AsyncTask的时候,耗时的任务放到了doInBackground(Params...params)中,在doInBackground()方法前如果还有初始化操作就使用onPreExecute(),doInBackground()方法执行完毕后,就会执行onPostExecute()方法。(也可以通过调用onProgressUpdate()方法来更新进度)。整个执行过程就是一个框架如图所示: