템플릿 메서드 패턴에 대한 정의는 Template method defines the skeleton of an algorithm as an abstract class, allowing its subclasses to provide concrete behavior.으로 위키에서 찾아볼 수 있다. 해석하자면 알고리즘의 골격을 추상 클래스로 정의하여 하위 클래스가 구체적인 동작을 제공할 수 있도록 하는 것이다.
우선 수퍼클래스 즉 추상 클래스는 서브 클래스에게 구현된 멤버를 상속해준다.
abstract class Letter {
String content;
public void setContent(String content) {
this.content = content;
}
이후 수퍼클래스에서 기능이 어떻게 동작하는지 정의한다. 즉 템플릿의 역할을 하는 메서드를 수퍼 클래스에 둔다.
public void print() {
this.printHeader();
System.out.println(this.content);
System.out.println();
System.out.printf(" from %s \n", this.getSign());
}
public abstract void printHeader();
public abstract void printFooter();
public abstract void String getSign();
}
위와 같이 추상메서드를 만들어두고 세부사항은 서브클래스에게 구현을 맡긴다.
상세한 기능에 대한 구현은 서브클래스에서 오버라이딩한다.
class TaxBill extends Letter {
@Override
public void printHeader() {
System.out.println("----------고지서입니다---------");
}
@Override
public String getSign() {
return "한국전력공사";
}
@Override
public void printFooter() {
System.out.println("-----------전력공사 드림----------");
}
}
public class PrintTemplate {
public static void main(String[] args) {
Letter1 letter = new Bill();
letter.setContent("이번달 전기요금은 54,500원 입니다.");
letter.print();
}
}
위와 같은 코드를 실행했을 때
아래와 같은 결과가 나오게 된다.
Template method 패턴은 상속을 통한 기능의 확장에 중점을 둔 디자인 패턴이라고 할 수 있다.
그러나 추상클래스에 정의한 메서드가 많아지게 되면 기능이 꼬일 수 있다는 단점이 있다.