模板方法模式就是定义一个模板结构(调用关系),将具体内容延迟到子类去实现,在不改变模板结构的前提下在子类中重新定义模板中的内容。模板方法模式是基于"继承"的,将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中。
public abstract class AbstractTemplate {
/**
* 模板方法
* 模板结构(先调用抽象方法,接着调用空方法,最后调用实现的方法)
*/
public void templateMethod(){
//调用基本方法
abstractMethod();
hookMethod();
concreteMethod();
}
/**
* 基本方法的声明(由子类实现)
*/
protected abstract void abstractMethod();
/**
* 基本方法(空方法)
*/
protected void hookMethod(){}
/**
* 基本方法(已经实现)
*/
private final void concreteMethod(){
System.out.println("it is a concreteMethod");
}
}
具体模板类,实现了父类所声明的基本方法,abstractMethod()方法所代表的就是强制子类实现的剩余逻辑,而hookMethod()方法是可选择实现的逻辑,不是必须实现的。
public class ConcreteTemplate extends AbstractTemplate{
//基本方法的实现
@Override
public void abstractMethod() {
//业务相关的代码
}
//重写父类的方法
@Override
public void hookMethod() {
//业务相关的代码
}
}
模板模式的关键是:子类可以置换掉父类的可变部分,但是子类却不可以改变模板方法所代表的顶级逻辑。