定义:模板方法模式的意图是,定义一个操作中的算法的骨架,而将一些步骤的实现延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。我们最常见的就是Spring框架里的各种Template。
举个栗子:把东西放到冰箱需要几步?
- 打开冰箱
- 把东西放到冰箱
- 关上冰箱
抽象类如下
public abstract class AbstractCarry {
public abstract void open();
public abstract void carry();
public abstract void close();
public void perform(){
open();
carry();
close();
}
}
对于一个任务我们可以抽象出其流程来,具体实现交给子类。把苹果放进冰箱,把大象放进冰箱,我们可以把流程抽象出来,构建其骨架,三个步骤是一样的,具体实现由子类决定。如下是大象装冰箱的实现类
public class ElephantCarry extends AbstractCarry{
@Override
public void open() {
System.out.println("----------打开冰箱----------");
}
@Override
public void carry() {
System.out.println("----------把大象放进去----------");
}
@Override
public void close() {
System.out.println("----------关上冰箱----------");
}
}
执行
public static void main(String[] args) {
ElephantCarry elephantCarry = new ElephantCarry();
elephantCarry.perform();
}
运行结果
----------打开冰箱----------
----------把大象放进去----------
----------关上冰箱----------
这时我们又遇到一个问题,大象主动进入冰箱,不需要我们扔进去了,流程少了 carry() 方法,咋搞??
钩子方法
我们在抽象类定义一个判断标记,然后对外提供一个public方法来让外界设置这个判断标记,这就像是开关一样,想让它ture和false都行。这个法俗称钩子方法。
新版抽象方法如下
public abstract class AbstractCarry {
public abstract void open();
public abstract void carry();
public abstract void close();
public void perform(){
open();
if (needCarry()) {
carry();
}
close();
}
/**
* 钩子方法:是否需要扔进去
* @return 默认返回 true
*/
public boolean needCarry(){
return true;
}
}
子类根据自身需求判断是否hook修改