design pattern - Template pattern

448 阅读1分钟

一个操作的具体步骤是确定的,但是它的每个具体步骤的实现各不相同。此时可以使用模板模式。

比如要做一个模块,它可以打印带有表头表体表尾的数据到HTML或者是Console:

  1. 基础类定义执行步骤,打印表头、表体、表尾
  2. 派生类精细化或者调整具体步骤的实现。在自己的特定的表头等打印步骤中为自己的类实现特定内容。比如HTMLReport应该为数据设置上标签。

事实上,当我完成MF的重构一书的第一章的案例的学习时,我居然并没有注意到它是一个模式呢。

模板方法如下:

public abstract class Report {
   //模板方法
   public final void play(){
      printHeader();
      printDetail();
      printFooter();
   }
}

如下案例,在Game基类也定义了一系列的步骤,然后由不同的子类细化或者定义它们的实际操作:

基类模板方法如下:

public abstract class Game {
   abstract void initialize();
   abstract void startPlay();
   abstract void endPlay();
   //模板方法
   public final void play(){
      initialize();
      startPlay();
      endPlay();
   }
}