例えば、テンプレートのあるクラスは
public abstract class AbstractSample { protected abstract void start(); protected abstract void finish(); public final void execute() { start(); System.out.println("execute"); finish(); } }
になります。execute()がテンプレートメソッドです。start()とfinishi()はサブクラスで以下のように定義します。
public class Sample extends AbstractSample { protected void start() { System.out.println("--- Start ---"); } protected void finish() { System.out.println("--- Stop ---"); } }
別のサブクラスでは以下のようにしてみます。
public class AnotherSample extends AbstractSample { protected void start() { System.out.println("*** スタート ***"); } protected void finish() { System.out.println("*** 終了 ***"); } }
Mainクラスは以下のようにしてみました。
public class Main { public static void main(String[] args) { AbstractSample sample = new Sample(); sample.execute(); AbstractSample anotherSample = new AnotherSample(); anotherSample.execute(); } }
実行結果はこんな感じです。
このようにすることで、
- サブクラスをいくつ作っても、大きな流れはテンプレートメソッドの通り(ロジック共通化)
- サブクラスをいくつ作っても、呼び出すメソッドは同じ名前のメソッド
といった点が挙げられます。具体的な処理はサブクラスに決めてもらわないといけないとは言え、抽象クラスで処理を形作れることが、抽象クラスの存在意義と言えるでしょう。
注意:本に付属のサンプルコードで、Linux向けのものは文字コードがEUC_JPになっているため、コンパイル時に場合によっては警告が出るかもしれません。その時は、コンパイル時にencodingオプションを入れて
%> javac -encoding EUC_JP *.java
とすること。
関連パターン
「Factory Methodパターン」 Template Methodパターンをインスタンス生成に応用した例
「Strategyパターン」Template Methodパターンでは継承を利用してプログラム動作を変更するのに対し、Strategyパターンでは移譲を利用してプログラム動作を変更する。
0 件のコメント:
コメントを投稿