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)パターンの作成
外出するときの行動をパターン化して,「行先に向かう」,「出先で目的を行う」,「帰宅する」という行動に分けて,外出先ごとに,パターン化を実装せよ.