一、背景
定义操作算法中的骨架,分离可变和不变的逻辑,将一些步骤延迟到子类中。
二、组成要素
抽象类
- 定义模板方法算法骨架
- 声明可变的方法和不可变的方法
模板方法
定义整个流程。
抽象方法
子类必须实现。
钩子 (hook) 方法
预留扩展点,提供缺省行为 (子类可选实现),通常是空的操作,由开发者进行扩展。
三、代码示例
public abstract class AbstractApplicationContext {
// 模板方法
public void refresh() {
// ...固定步骤
postProcessBeanFactory(beanFactory); // <- HOOK 1
// ...固定步骤
onRefresh(); // <- HOOK 2 (关键扩展点)
// ...固定步骤
}
// HOOK 1: BeanFactory 后处理 (默认空实现)
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {}
// HOOK 2: 子类特殊初始化 (默认空实现)
protected void onRefresh() {}
}
四、Spring 中的命名约定
前缀 Do-
例子
org.springframework.beans.factory.support.AbstractBeanFactory#createBean org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean