模板方法是进行程序设计时经常用到的设计模式。很多人虽然可能甚至没有学过设计模式,但在框架思维的作用下,依然使用到了它。模板方法的思想就在于,父类将骨架定好,子类根据需要自定义变化的部分。
我们看一下下面的示例代码:
public class TemplateMethod {
public static abstract class FatherClass {
public void doSomeThing() {
start();
step1();
step2();
end();
}
protected void start() {
// 父类提供默认行为,可被子类覆盖
System.out.println("start step");
}
protected abstract void step1();
protected abstract void step2();
private void end() {
System.out.println("end step");
}
}
public static class ChildClass extends FatherClass {
@Override
protected void step1() {
System.out.println("this step1 is done by ChildClass");
}
@Override
protected void step2() {
System.out.println("this step2 is done by ChildClass");
}
}
public static void main(String[] args) {
FatherClass child = new ChildClass();
child.doSomeThing();
}
}
父类中doSomeThing代表一个业务逻辑,它需要四个特定的步骤执行。其中end是通用逻辑,代表通用不变的部分;start提供了默认的实现,但可被子类重写覆盖,代表相对不变的部分。而step1和step2则是需要子类提供,代表可变的业务逻辑。注意:这里可变、不变的顺序不是固定的,根据实际业务场景而定,也有可能是中间不变,开始和结尾部分是变化的。
我们运行一下代码:可以看到,实际的效果:
我们看一下Spring中的模板方法例子:
在doClose方法中也做了好几个事情,大部分都是公共的实现。只有closeBeanFactory是需要子类自行实现。而在onClose中也提供了默认实现,但运行子类自行决定是否需要做些什么,这个其实是预留的钩子,运行子类自行实现它想在关闭时做的任何事,虽然父类也不清楚这些事是啥。