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