알고리즘의 뼈대를 정의하고 일부를 서브 클래스로 위임한다.
알고리즘 구조를 변경하지 않고 알고리즘의 일부 내용을 서브 클래스에서 재정의 할 수 있도록 한다.
: 레시피 중에서 특정 부분은 같고, 특정 부분만 다를 수 있다.
public final void prepareRecipe(){ //final: overriding 못하도록 한다.
voilwater();
brew();
pourInCup();
addCondiments();
}
public abstract class CaffeineBeverageWithHook {
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) {
addCondiments();
}
}
public abstract void brew();
public abstract void addCondiments();
public void boilWater() {
System.out.println("물 끓이는 중"); }
public void pourInCup() {
System.out.println("컵에 따르는 중"); }
boolean customerWantsCondiments() { // Hook
return true;
}
}
public class CoffeeWithHook extends CaffeineBeverageWithHook {
public void brew() {
System.out.println("필터로 커피를 우려내는 중");
}
public void addCondiments() {
System.out.println("우유와 설탕을 추가하는 중");
}
public boolean customerWantsCondiments() {
char answer = getUserInput();
return (answer == 'y') ? true : false;
}
public char getUserInput() {
String answer = null;
Scanner sc = new Scanner(System.in);
System.out.println("커피에 우유와 설탕을 추가하시겠습니까?");
answer = sc.next();
return answer.charAt(0);
}
}