概念

Template Method Pattern / Template Pattern。
模板(方法)模式是行为型模式。
它能够为一整套固定的流程创造一个概括性的流程模板,而每个流程的细节则可以交给用户实现。比如定义一个抽象类公开自己的一系列方法作为执行模板,其子类根据自身需要实现这些方法,而用户调用则使用抽象类中定义的方法进行。 模板模式 - 图1

模板模式中的钩子方法

上面的例子中,模板方法在抽象类中是硬编码进行的方法调用,你没有办法去掉模板中的某一项或者增添额外的不属于模板方法的方法。这很明显不利于开发和扩展。

一个很好的做法是在模板抽象类中添加一些预定义的钩子方法(我更倾向于称其为锚点),这种方法在抽象类中代表一种占位符或者默认行为,在子类不覆盖钩子方法时,模板所做的事情并没有结构上的改变。而在子类覆盖了钩子方法时,你可以在其中添加其他业务逻辑或是影响其父类(模板抽象类)中模板方法中的流程判定。

比如,如果你需要在环境中包含某个类时才进行模板方法中的 opt2() ,那么就增加一个返回为 false 的钩子(方法)。模板方法流程中将使用这个钩子方法进行判定是否执行 opt2() , 子类则可以实现这个钩子方法,其内容就是判断类路径下是否包含指定的类,如果有则返回true,没有则返回false。

实例

参见Spring的ApplicationContext的几个方法实现,如 refresh()

实际上模板方法能够很好地暴露和被构建对象生命周期有关的概念,相比于builder这种直白的建造者方法,模板能够提供更多的默认流程控制的行为。