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の大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^