- 정의
- 사용 이유
- 구현
템플릿 메서드 패턴 (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()
)은 변경되지 않으며, 새로운 서브 클래스와 필요한 기능을 유연하게 추가할 수 있다.