- 정의
- 사용 이유
- 구현
템플릿 메서드 패턴 (Template Method Pattern)
여러 클래스에서 변하지 않고 공통으로 사용되는 기능(method)을 상위 클래스에서 정의하고 자주 변경되는 기능은 하위 클래스에서 정의
구조

AbstractClass : 상위 클래스templateMethod() : 변하지 않는 공통 기능ConcreteClass : 하위 클래스hook() : 자주 변경되거나 확장되는 기능김밥을 예로 들어보자.
김, 밥이라는 중심 재료와 부수적인 재료들로 이루어진다.야채 김밥
public class NonVegetableKimbab {
public void makeVagetableKimbab() {
addKim();
addRice();
addVegetable();
}
private void addVegetable() {
System.out.println("야채 추가");
}
private void addRice() {
System.out.println("밥 추가");
}
private void addKim() {
System.out.println("김 추가");
}
}
참치 김밥
public class NonTunaKimbab {
public void makeTunaKimbab() {
addKim();
addRice();
addTuna();
}
private void addTuna() {
System.out.println("참치 추가");
}
private void addRice() {
System.out.println("밥 추가");
}
private void addKim() {
System.out.println("김 추가");
}
}
손님
public class Guest {
public static void main(String[] args) {
NonVegetableKimbab nonVegetableKimbab = new NonVegetableKimbab();
NonTunaKimbab nonTunaKimbab = new NonTunaKimbab();
System.out.println("****야채 김밥 추가****");
nonVegetableKimbab.makeVagetableKimbab();
System.out.println("****참치 김밥 추가****");
nonTunaKimbab.makeTunaKimbab();
}
}
print >>>
****야채 김밥 추가****
김 추가
밥 추가
야채 추가
****참치 김밥 추가****
김 추가
밥 추가
참치 추가
NonVegetableKimbab과 NonTunaKimbab 두 클래스 중, addKim()과 addRice()는 중복된다. 김밥의 종류가 많아질수록 중복 메서드도 많이지기 마련.김밥 (Abstract Class)
public abstract class Kimbab {
protected void makeKimbab() {
addKim();
addRice();
addAnother();
}
private void addKim() {
System.out.println("김 추가");
}
private void addRice() {
System.out.println("밥 추가");
}
abstract void addAnother();
}
templateMethod()addKim()addRice()hook()addAnother()야채 김밥 (ConcreteClass)
public class VegetableKimbab extends Kimbab {
@Override
void addAnother() {
System.out.println("야채 추가");
}
}
참치 김밥 (ConcreteClass)
public class TunaKimbab extends Kimbab {
@Override
void addAnother() {
System.out.println("참치 추가");
}
}
손님
public class Guest {
public static void main(String[] args) {
Kimbab vegetableKimbab = new VegetableKimbab();
Kimbab tunaKimbab = new TunaKimbab();
System.out.println("****야채 김밥 추가****");
vegetableKimbab.makeKimbab();
System.out.println("****참치 김밥 추가****");
tunaKimbab.makeKimbab();
}
}
print >>>
****야채 김밥 추가****
김 추가
밥 추가
야채 추가
****참치 김밥 추가****
김 추가
밥 추가
참치 추가
여러 종류의 김밥이 추가되어도 공통 기능(addKim(), addRice())은 변경되지 않으며, 새로운 서브 클래스와 필요한 기능을 유연하게 추가할 수 있다.