模板方法

2025/04/02

一、背景

定义操作算法中的骨架,分离可变和不变的逻辑,将一些步骤延迟到子类中。

二、组成要素

抽象类

  1. 定义模板方法算法骨架
  2. 声明可变的方法和不可变的方法

模板方法

定义整个流程。

抽象方法

子类必须实现。

钩子 (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 中的命名约定

  1. 前缀 Do-

  2. 例子

    org.springframework.beans.factory.support.AbstractBeanFactory#createBean
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
    

五、参考