추상클래스에서 구현되는 메서드긴 하지만, 기본적인 내용만 구현되어 있거나 아무 코드도 들어있지 않은 메서드이다.
서브클래스 입장에서는 알고리즘에 끼어들 수 있다.
public abstract class CaffeineBeverageWithHook {
void prepareRecipe() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) {
addCondiments();
}
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
System.out.println("물 끓이는 중");
}
/**
* 이 메소드는 후크 메소드로, 필요한 경우에는 하위 클래스에서 오버라이드 할 수 있다.
*/
boolean customerWantsCondiments() {
return true;
}
}
후크를 서브클래스에서 오버라이딩하여 활용한다. 이 예에선 알고리즘의 특정 부분(addCondiments)을 어떻게 처리할지 여부를 결정하기 위한 용도로 후크를 사용한다.
public class CoffeeWithHook extends CaffeineBeverageWithHook{
public void brew() {
// implements
}
public void addCondiments() {
// implements
}
public boolean customerWantsCondiments() {
String answer = getUserInput();
if (answer.toLowerCase().startsWith("y")) {
return true;
}
return false;
}
private String getUserInput() {
String answer = null;
System.out.println("커피에 우유와 설탕을 넣어 드릴까요?");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
try {
answer = in.readLine();
} catch (IOException ex) {
System.err.println("IO 오류");
}
if (answer == null) {
return "no";
}
return answer;
}
}