☕ JAVA

[Java] 템플릿 메서드 패턴(Template Method Pattern)

별이⭐ 2024. 5. 31. 23:16

템플릿 메서드 패턴(Template Method Pattern)

  • 템플릿 메서드 패턴은 디자인 패턴 중 하나로, 알고리즘의 구조를 메서드에 정의하고, 알고리즘의 일부 단계를 서브 클래스에서 구현하도록 하여 알고리즘의 일부 변경을 허용하는 패턴이다.
  • 이러한 패턴은 특히 공통의 알고리즘 과정이 있지만, 그 과정 중 일부가 클래스마다 다를 때 유용하다.
  • 추상 클래스를 사용해 템플릿 메서드를 정의하고, 구체적인 작업은 서브 클래스에서 오버라이드하여 구현한다.

 

템플릿 메서드 패턴의 구조

  • 추상 클래스(abstract class)
    • 알고리즘의 단계를 정의하는 템플릿 메서드와 알고리즘의 일부를 구현하는 하나 이상의 추상 메서드로 구성된다.
  • 구체 클래스(concrete class)
    • 추상 클래스를 상속받아 추상 메서드를 구현한다. 이를 통해 알고리즘의 일부 단계를 구체화한다.

 

예시) 커피와 차 준비하기

  • BeverageRecipe는 커피와 차 준비의 공통 알고리즘을 정의한 추상 클래스이다.
  • prepareRecipe메서드는 알고리즘의 구조를 정의하는 템플릿 메서드이다.
  • brewaddCondiments는 서브 클래스에서 구현되는 추상 메서드이다.
  • 이렇게 하면 기본 알고리즘 구조를 변경하지 않고도 알고리즘의 일부 단계를 다양하게 구현할 수 있다.
  1. 추상 클래스 정의하기
public abstract class BeverageRecipe {
  // 템플릿 메서드
  public final void prepareRecipe() {
    boilWater();
    brew(); 
    pourInCup(); 
    addCondiments();
  }

  abstract void brew();				    // 추상 메서드
  abstract void addCondiments();	    // 추상 메서드
  
  public void boilWater() {
    System.out.println("물을 끓입니다.");
  }

  public void pourInCup() {
    System.out.println("컵에 따릅니다."); 
  }
}
  1. 구체 클래스 구현하기
public class Coffee extends BeverageRecipe {
  @Override
  void brew() {
    System.out.println("필터를 통해 커피를 우려냅니다.");
  }
  
  @Override
  void addCondiments() {
    System.out.println("설탕과 우유를 추가합니다.");
  }
}
public class Tea extends BeverageRecipe {
  @Override
  void brew() {
    System.out.println("차를 우려냅니다.");
  }
  
  @Override
  void addCondiments() {
    System.out.println("레몬을 추가합니다.");
  }
}
  1. 사용 예제
public class TemplateMethodPatternDemo {
  public static void main(String[] args) {
    BeverageRecipe tea = new Tea();
    tea.prepareRecipe();
    
    BeverageRecipe coffee = new Coffee();
    coffee.prepareRecipe();
  }
}