# 简介

一个抽象类公开定义了执行它的方法的方式 / 模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

关键代码框架在抽象类中实现,其他步骤在子类实现。模板方法需要加上 final 防止被重写。要注意的是,子类要重写的不是模板方法,而是子类需要重写的方法。抽象类可以通过模板方法来规定一整套行为流程,但是流程中各个行为可以由子类自己实现。

public abstract class Game {
   abstract void initialize();
   abstract void startPlay();
   abstract void endPlay();
 
   // 模板
   public final void play(){
 
      // 初始化游戏
      initialize();
 
      // 开始游戏
      startPlay();
 
      // 结束游戏
      endPlay();
   }
}
//initialize,startPlay,endPlay 方法可以由子类重写

# 意图

模板方法可以定义算法框架,将一些步骤的实现延迟到子类,通过模板方法,子类可以重新定义算法的某些步骤,而不用改变算法的结构。

# 举例

泡茶和泡咖啡都有类似的流程(烧水,倒入杯中),但是某些步骤会有点不一样(加调料,brew-- 酝酿?),要求复用那些相同步骤的代码。

image-20220807222733874

# 参考

菜鸟教程:https://www.runoob.com/design-pattern/template-pattern.html

Java 全栈知识体系:https://pdai.tech/md/dev-spec/pattern/17_template.html