パターンについて

アルゴリズム実現するためのテンプレート作成するパターンになります。
同じような処理が複数あるとき、基本操作(primitiveOperation)をサブクラスでオーバーライドすることで、
全体を共通化しながら、バリエーションによる影響を局所的に抑えられます

HeadFirstデザインパターンでの定義

メソッドにおけるアルゴリズムの骨組みを定義し、いくつかの手順をサブクラスに先送りします。
TemplateMethodは、アルゴリズムの構造を変えることなく、アルゴリズムのある手順をサブクラスに再定義します

パターン構造

templatemethod_pattern
構成要素
AbstractClass : templateMethodは基本操作(primitiveOperation)を利用しますが実装がサブクラスに任せます
ConcreteClass : 抽象操作の実装します

サンプル

カフェイン飲料クラステンプレートを利用いて、コーヒーと紅茶を生成する場合

・カフェイン飲料(AbstractClass)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public abstract class CaffeineBeverage {
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
System.out.println("Boiling water");
}
void pourInCup() {
System.out.println("Pouring into cup");
}
}

・コーヒー(ConcreteClass)

1
2
3
4
5
6
7
8
public class Coffee extends CaffeineBeverage {
public void brew() {
System.out.println("Dripping Coffee through filter");
}
public void addCondiments() {
System.out.println("Adding Sugar and Milk");
}
}

・紅茶(ConcreteClass)

1
2
3
4
5
6
7
8
public class Tea extends CaffeineBeverage {
public void brew() {
System.out.println("Steeping the tea");
}
public void addCondiments() {
System.out.println("Adding Lemon");
}
}

・実行コード(Client)

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Client {
public static void main(String[] args) {
Tea tea = new Tea();
Coffee coffee = new Coffee();
System.out.println("\nMaking tea...");
tea.prepareRecipe();
System.out.println("\nMaking coffee...");
coffee.prepareRecipe();
}
}


X