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("*****");
}
}

view raw
Human.java
hosted with ❤ by GitHub

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);
}
}

view raw
Japanese.java
hosted with ❤ by GitHub

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);
}
}

view raw
American.java
hosted with ❤ by GitHub

呼び出し側

呼び出す側はポリモーフィズムを利用して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();
});
}
}

view raw
TemplateSample.java
hosted with ❤ by GitHub

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA