Template Method

Template Methodは,定義されているメソッドと,そのメソッドの使い方が定義されていて,メソッドの具体的な処理内容はサブクラスで実装するためのパターンである. このパターンに則ってサブクラスを作成することで,サブクラスごとに異なる処理を実装しながら,オブジェクトを操作する方法や手順を共通にすることができる.

クラス構造

例として,スーパーマーケットの仕事を想定したクラスを示す.MarketJobは,スーパーマーケットの各部門の仕事をこなすためのテンプレートが定義されている.MarketJobを継承して,各部門の仕事を具体的に実装する.抽象クラスとして,切る「cut()メソッド」,盛り付ける「put()メソッド」,パックする「pack()メソッド」がある.これらを順番に実行する「work()メソッド」で,上記の抽象メソッドを順番に実行する. MarketJobクラスを継承した,SengyoクラスとSeikaクラスでは,MarketJobクラスで抽象メソッドとして定義されていたメソッドを,自分のクラスにあわせて具体的に実装する.


ソースコード

MarketJobは,切る「cut()メソッド」,盛り付ける「put()メソッド」,パックする「pack()メソッド」を抽象メソッドとする.これらを順番に実行する「work()メソッド」で,上記の抽象メソッドを順番に実行する.

abstract public class MarketJobs
{
  abstract public void cut();
  abstract public void put();
  abstract public void pack();
  //これがテンプレートメソッド
  public void working()
  {
    cut();
    put();
    pack();
  }
}

鮮魚担当を模している,Sengyoクラスでは,cut()メソッドの実装として,刺身を切る実装が行われる.put()メソッドでは,刺身をトレイに置くことと,タンポポを添える実装をする.pack()メソッドでは,刺身をパックする.

public class Sengyo extends MarketJobs
{
  Sengyo()
  {
    System.out.println("===鮮魚担当になった===");
  }
  @Override
  public void cut()
  {
    System.out.println("刺身を切るお");
  }
  @Override
  public void put()
  {
    System.out.println("トレイに置くお");
    System.out.println("タンポポを置くお");
  }
  @Override
  public void pack()
  {
    System.out.println("ラップでパックするお");
  }
}

青果担当を模している,Seikaクラスでは,野菜を切って,パックするだけなので,盛り付けるメソッドでは,何もしないように実装した.

public class Seika extends MarketJobs
{
  Seika()
  {
    System.out.println("===青果担当になった===");
  }
  @Override
  public void cut()
  {
    System.out.println("野菜を切るお");
  }
  @Override
  public void put()
  {
  }
  @Override
  public void pack()
  {
    System.out.println("野菜をラップでパックするお");
  }
}

定義したクラスをインスタンス化して,テンプレートメソッドを実行するMainクラスを示す.

public class Main
{
  static public void main(String args[])
  {
    MarketJobs sengyo = new Sengyo();
    sengyo.working();
    MarketJobs seika = new Seika();
    seika.working();
  }
}

実行結果は以下のようになる.

===鮮魚担当になった===
刺身を切るお
トレイに置くお
タンポポを置くお
ラップでパックするお
===青果担当になった===
野菜を切るお
野菜をラップでパックするお

演習

(1)追加

MarketJobをテンプレートとして,精肉部門に配属されたことを表わすクラスを作成せよ.さらに,精肉部門の担当者に相当するインスタンスを作成して,テンプレートの仕事が実施される様子を確認せよ.

(2)パターンの作成

外出するときの行動をパターン化して,「行先に向かう」,「出先で目的を行う」,「帰宅する」という行動に分けて,外出先ごとに,パターン化を実装せよ.