⇒ 1. 알고리즘을 여러 단계로 나눔
package templateMethod;
public abstract class Ramen {
public final void makeRamen() {
boilWater();
putNoodles();
putPeppers();
putExtra();
waitForMinutes();
}
protected void boilWater() {
System.out.println("물을 끓인다.");
}
protected void putNoodles() {
System.out.println("면을 넣는다.");
}
protected abstract void putPeppers();
protected void putExtra() {}
protected abstract void waitForMinutes();
}
package templateMethod;
public class OrgRamen extends Ramen {
@Override
protected void putPeppers() {
System.out.println("일반 고추가루를 넣는다");
}
@Override
protected void waitForMinutes() {
System.out.println("3분간 기다린다.");
}
}
package templateMethod;
public class spicyRamen extends Ramen {
@Override
protected void putPeppers() {
System.out.println("청양고추가루를 넣는다.");
}
@Override
protected void waitForMinutes() {
System.out.println("4분간 기다린다.");
}
}
package templateMethod;
public class RamenWithEggs extends Ramen{
@Override
protected void putPeppers() {
System.out.println("일반 고춧가루를 넣는다.");
}
@Override
protected void waitForMinutes() {
System.out.println("5분간 기다린다.");
}
@Override
protected void putExtra() {
System.out.println("계란을 넣는다.");
}
}
package templateMethod;
public class Main {
public static void main(String[] args) {
Ramen orgRamen = new OrgRamen();
Ramen spicyRamen = new spicyRamen();
Ramen eggRamen = new RamenWithEggs();
orgRamen.makeRamen();
System.out.println("===============");
spicyRamen.makeRamen();
System.out.println("===============");
eggRamen.makeRamen();
}
}
물을 끓인다.
면을 넣는다.
일반 고추가루를 넣는다
3분간 기다린다.
===============
물을 끓인다.
면을 넣는다.
청양고추가루를 넣는다.
4분간 기다린다.
===============
물을 끓인다.
면을 넣는다.
일반 고춧가루를 넣는다.
계란을 넣는다.
5분간 기다린다.
⇒ 기존 코드에서 나타나는 차이점을 뽑아 이를 별도의 새로운 연산들로 구분 후 달라진 코드 부분을 이 새로운 연산을 호출하는 템플릿 메서드로 대체
⇒ 템플릿 메서드가 어떤 특정한 시점에 훅(hook) 연산을 호출하도록 정의함으로써 특정 시점에서만 확장되도록 함
⇒ 라이브러리에 정의할 클래스들의 공통 부분을 분리하는 수단
⇒ 구체 연산(concrete operation) : ConcreteClass나 사용자 클래스에 정의된 연산
AbstractClass 구체 연산: 서브클래스에서 일반적으로 유용한 연산
기본 연산 : 추상화된 연산
팩토리 메서드
훅 연산 : 필요하다면 서브클래스에서 확장할 수 있는 기본 행동을 제공하는 연산으로 기본적으로 아무 내용도 정의하지 않음