하위 클래스가 공통적으로 구현하는 메서드의 순서를 상위클래스에서 템플릿 메서드로 제공하는 패턴이다.
알고리즘을 상위 클래스에서 정의하는 패턴이다.
탬플릿 메서드는 공통로직을 수행하고, 필요한 메서드를 호출한다.
기능의 뼈대와 조건을 구현하교 구격화한다.
추상메서드 : 탬플릿 메서드에서 호출한다. 하위 클래스가 반드시 오버라이딩한다.
Hook 메서드 : 템플릿 메서드에서 호출한다. 하위 클래스는 선택적으로 오버라이딩할 수 있다.
추상클래스이며, 추상메서드와 HOOK메서드를 가지고 있다.
package OOP06.templateMethodPattern;
abstract public class HandHygiene {
void washingHands (){
step1();
step2();
System.out.println("손 문지르기");
}
void step1(){
System.out.println("물 묻히기");
}
abstract void step2();
}
상위클래스의 추상 메서드는 필수로, HOOK메서드는 선택적으로 구현한다.
package OOP06.templateMethodPattern;
public class HandHygien_Sanitizer extends HandHygiene{
//HOOK메서드도 오버라이딩해줌
@Override
void step1() {
System.out.println("물없이");
}
@Override
void step2() {
System.out.println("소독제 사용");
}
}
package OOP06.templateMethodPattern;
public class HandHygien_Soap extends HandHygiene{
@Override
void step2() {
System.out.println("비누 사용");
}
}
상위클래스참조변수를 가지고, 오버라이딩된 하위메서드의 출력을 보여준다.
package OOP06.templateMethodPattern;
public class Driver {
public static void main(String[] args) {
HandHygiene sanitizer = new HandHygien_Sanitizer();
HandHygiene soap = new HandHygien_Soap();
sanitizer.washingHands();
soap.washingHands();
}
}
실행화면
물없이
소독제 사용
손 문지르기
물 묻히기
비누 사용
손 문지르기
핵심알고리즘이 존재할 때, 탬플릿 메서드 패턴을 사용하면 상위클래스만으로도 동작을 이해하기 쉽게 만들어주는구나!