템플릿(Template)
은 형판, 형틀이라는 뜻을 가지고있습니다. 형판이라는 것은 어떤 것을 만들기 위해서 미리 모양을 새겨 놓은 판을 말합니다.
템플릿이 형틀이라는 의미를 갖고 있듯이, 템플릿 메소드 패턴
은 특정 기능을 형틀처럼 캡슐화 하여 이용하는 기능입니다. 이때 템플릿을 추상클래스로 정의하여 하위클래스에서 상속하여서 이용하게 됩니다. 템플릿 메소드 패턴
은 행동 패턴에 포함됩니다.
템플릿 메소드 패턴
처럼 추상화시키는 메소드들은 공통된 알고리즘이나 구조를 추상화 시키게 됩니다.
쿠키 가게가 있습니다. 이 가게에서는 초코 쿠키와 시나몬 쿠키를 판매하는데 다음과 같은 방식으로 제조를 합니다.
//초코 쿠키
public class ChocolateCookie {
public void orderCookie(){
knead();
baking();
decorateChoco();
packageCookies();
}
public void knead(){
System.out.println("쿠키 도우 반죽");
}
public void baking() {
System.out.println("쿠키 굽는 중");
}
public void decorateChoco(){
System.out.println("초콜릿 장식하기");
}
public void packageCookies(){
System.out.println("쿠키 포장하기");
}
}
//시나몬 쿠키
public class CinnamonCookie {
public void orderCookie(){
knead();
baking();
decorateCinnamon();
packageCookies();
}
public void knead(){
System.out.println("쿠키 도우 반죽");
}
public void baking() {
System.out.println("쿠키 굽는 중");
}
public void decorateCinnamon(){
System.out.println("시나몬 장식하기");
}
public void packageCookies(){
System.out.println("쿠키 포장하기");
}
}
그런데 과정을 보니 knead(반죽), baking(굽기), package(포장) 하는 과정이 완전히 동일합니다. 이렇게 같은 메소드가 반복되면 나중에 수정이나 점검을 할 때 곤란하겠죠? 또한 다른 쿠키를 추가하기 위해서 다른 쿠키에도 동일한 코드를 작성해야하는 문제점이 있습니다. 그래서 우리는 중복되는 부분을 템플릿화 시켜서 이용하려고 합니다. 다음은 템플릿 메소드 패턴
으로 구현된 템플릿화 된 과정입니다.
public abstract class CookieTemplate { //추상 메소드를 포함하므로 추상 클래스 선언
final void prepareCookies() {
knead();
baking();
decorate();
packageCookies();
}
public void knead(){
System.out.println("쿠키 도우 반죽");
}
public void baking() {
System.out.println("쿠키 굽는 중");
}
//쿠키마다 장식법이 다르므로 추상 메소드 선언!
abstract void decorate();
public void packageCookies(){
System.out.println("쿠키 포장하기");
}
}
쿠키마다 장식방법이 다릅니다. 그래서 우리는 이름을 decorate로 통일하고 하위 클래스에서 구체적인 구현을 하려고 합니다. 이제 템플릿 메소드가 적용된 쿠키 클래스를 확인해 볼까요?
//초코 쿠키
public class ChocolateCookie extends CookieTemplate {
@Override
void decorate() {
System.out.println("초콜릿 장식하기");
}
}
//시나몬 쿠키
public class CinnamonCookie extends CookieTemplate {
@Override
void decorate() {
System.out.println("시나몬 장식하기");
}
}
중복되는 부분을 제거했더니 쿠키 클래스가 엄청 간단해졌죠? 그럼 결과를 확인해보겠습니다. 템플릿 메소드는 다음과 같이 사용합니다.
public static void main(String[] args) {
ChocolateCookie chocolateCookie = new ChocolateCookie();
chocolateCookie.prepareCookies();
System.out.println("=========================");
CinnamonCookie cinnamonCookie = new CinnamonCookie();
cinnamonCookie.prepareCookies();
}