본문 바로가기

디자인 패턴

디자인 패턴 - 템플릿 메소드 패턴(Template Method Pattern)

1. 정의

  • 알고리즘의 골격을 정의한다. 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래스에서 재정의 할 수 있다.

2. 예시

  • 커피와 홍차를 만든다.(둘의 제작 과정은 비슷하다.)

3. 그림

4. 클래스 다이어그램

5. 코드

public class Client {
    public static void main(String[] args){

        CaffeineBeverage tea = new Tea();
        tea.prepareRecipe();

        System.out.println("------");

        CaffeineBeverage coffee = new Coffee();
        coffee.prepareRecipe();
    }
}
/* 출력
물을 끓인다.
찻잎을 우려낸다.
컵에 음료를 따른다.
레몬을 추가한다.
------
물을 끓인다.
필터로 커피를 우려낸다.
컵에 음료를 따른다.
시럽을 추가한다.
*/
public abstract class CaffeineBeverage {
    // 알고리즘군은 바꿀 수 없게 final로 선언했음
    final void prepareRecipe(){
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    protected abstract void brew();

    protected abstract void addCondiments();

    private void pourInCup() {
        System.out.println("컵에 음료를 따른다.");
    }

    private void boilWater() {
        System.out.println("물을 끓인다.");
    }
}
public class Tea extends CaffeineBeverage{
    @Override
    protected void brew() {
        System.out.println("찻잎을 우려낸다.");
    }

    @Override
    protected void addCondiments() {
        System.out.println("레몬을 추가한다.");
    }
}
public class Coffee extends CaffeineBeverage{
    @Override
    protected void brew() {
        System.out.println("필터로 커피를 우려낸다.");
    }

    @Override
    protected void addCondiments() {
        System.out.println("시럽을 추가한다.");
    }
}

https://github.com/kang-seongbeom/design_pattern

💡 Github에서 디자인 패턴 코드를 볼 수 있습니다.

6. 설명

  • 카페인 음료를 만드는 과정은 네 가지다.
    1. 물을 끓임
    2. 재료를 우려냄
    3. 컵에 음료를 부음
    4. 첨가물을 추가함
  • 위 네 가지의 과정을 통합한 prepareRecipe()이 템플릿 메소드다.
  • prepareRecipe()의 과정 중 2, 4번의 과정을 서브클래스에서 정의한다.
  • prepareRecipe()의 알고리즘 구조는 그대로 유지하면서 특정 단계를 서브클래스에서 구현할 수 있게 된다.