JavaのデザインパターンTemplate Method

JavaのデザインパターンTemplate Method

Template MethodはJavaのポリモーフィズムを利用したデザインパターンです。

処理の流れ(ロジック)を親クラスのメソッドに記述します。子クラスではロジックを記述しません。

その為、ロジックに変更・不具合があっても親クラスに記述した処理フローを修正すればよいというデザインパターンです。

メリット

  • 子クラスでの処理フロー記述が不要
  • 親クラスで処理フローが決まっているので、処理フローの変更は親クラスだけでおこなえばよい

以下のクラス構成とします。

クラス 意味
Human 抽象クラス
American 子クラス
Japanese 子クラス

Humanクラスです。

package jp.co.confrage.template;

public abstract class Human {
  protected String sayMessage;
  protected String byeMessage;

  public Human(String sayMessage, String byeMessage) {
    this.sayMessage = sayMessage;
    this.byeMessage = byeMessage;
  }

  public abstract void say(String message); // サブクラスで実装してもら

  public abstract void handShake(); // サブクラスで実装してもら

  public abstract void bye(String message); // サブクラスで実装してもら

  public final void greeting() { // 処理フローはこのメソッドで記述する
    System.out.println("*****");
    say(sayMessage);
    handShake();
    bye(byeMessage);
    System.out.println("*****");
  }
}

greetingメソッドで処理のロジックを書いています。ここでは順にsay(),handShake(),bye()メソッドが呼ばれます。

各々の子クラスでは、say(),handShake(),bye()の実装を書きます。処理のロジックは親クラスのgreetingに記述するのがTemplate Methodです。

Humanクラスを継承しているJapaneseクラスです。

package jp.co.confrage.template;

public class Japanese extends Human {

  public Japanese(String sayMessage, String byeMessage) {
    super(sayMessage, byeMessage);
  }

  @Override
  public void handShake() {
    System.out.println("握手");
  }

  @Override
  public void say(String message) {
    System.out.println(message);
  }

  @Override
  public void bye(String message) {
    System.out.println(message);
  }
}

Americanクラス

package jp.co.confrage.template;

public class American extends Human {
  public American(String sayMessage, String byeMessage) {
    super(sayMessage, byeMessage);
  }

  @Override
  public void handShake() {
    System.out.println("handShake");
  }

  @Override
  public void say(String message) {
    System.out.println(message);
  }

  @Override
  public void bye(String message) {
    System.out.println(message);
  }
}

呼び出し側

呼び出す側はポリモーフィズムを利用してHumanクラスの変数を定義します。

package jp.co.confrage.template;

import java.util.stream.Stream;

public class TemplateSample {

  public static void main(String[] args) {
    Human[] human = {new American("こんにちは", "さようなら"), new Japanese("Hello", "Bye")};

    Stream.of(human)
        .forEach(
          e -> {
            e.greeting();
          });
  }
}

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました