Create a gist now

Instantly share code, notes, and snippets.

Embed
What would you like to do?
TemplateMethodパターン

TemplateMethodパターン

HeadFirstデザインパターン Index

パターンについて

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

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

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

パターン構造

templatemethod_pattern

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

サンプル

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

カフェイン飲料(AbstractClass)

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)

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)

public class Tea extends CaffeineBeverage {
	public void brew() {
		System.out.println("Steeping the tea");
	}
	public void addCondiments() {
		System.out.println("Adding Lemon");
	}
}

実行コード(Client)

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();
	}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment