본문 바로가기
Programming/디자인 패턴

템플릿 메소드 패턴 Template Method Pattern

by Bam_t 2021. 9. 23.
728x90

템플릿(Template)은 형판, 형틀이라는 뜻을 가지고있습니다. 형판이라는 것은 어떤 것을 만들기 위해서 미리 모양을 새겨 놓은 판을 말합니다.


1. 템플릿 메소드

템플릿이 형틀이라는 의미를 갖고 있듯이, 템플릿 메소드 패턴은 특정 기능을 형틀처럼 캡슐화 하여 이용하는 기능입니다. 이때 템플릿을 추상클래스로 정의하여 하위클래스에서 상속하여서 이용하게 됩니다.

이처럼 추상화시키는 메소드들은 공통된 알고리즘이나 구조를 추상화 시키게 됩니다. 

 

 

2. 템플릿 메소드 구현하기

쿠키 가게가 있습니다. 이 가게에서는 초코 쿠키와 시나몬 쿠키를 판매하는데 다음과 같은 방식으로 제조를 합니다.

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();
    }


https://github.com/Bam-j/DesignPattern/tree/master/src/TemplateMethod

 

GitHub - Bam-j/DesignPattern: 디자인 패턴 블로그 기재

디자인 패턴 블로그 기재. Contribute to Bam-j/DesignPattern development by creating an account on GitHub.

github.com

 

728x90

댓글