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

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^


コメント