본문 바로가기
디자인 패턴

디자인패턴: 템플릿 메소드 패턴

by dharana7723 2022. 12. 15.

템플릿 메서드 패턴은 알고리즘의 구조를 정의하고, 알고리즘의 일부를 서브클래스에서 구현함으로써 알고리즘을 재사용하기 쉽도록 만든 설계 패턴입니다.

일반적으로 템플릿 메서드 패턴은 알고리즘의 각 단계를 정의하는 추상 메서드로 구성되어 있습니다. 그리고 이 추상 메서드는 서브클래스에서 구현하도록 합니다. 이렇게 함으로써 서브클래스는 알고리즘의 구조를 변경하지 않고도 개별적인 단계를 재정의할 수 있습니다.

 

템플릿 메서드 패턴의 예를 위해, 커피와 차의 제조 과정을 살펴보겠습니다. 이 과정은 물을 끓이고, 물을 어떤 재료에 붓는 두 단계로 구성되어 있습니다. 이를 코드로 표현하면 다음과 같습니다.

 

public abstract class CaffeinBeverage(){

 

      public void prepareRecipe(){

                pourWater();

                addCondiments();

                brew();

       }

       public abstract void brew();

       public abstract void  addCondiments();

       public void pourWater();

}

 

위 코드에서 CaffeineBeverage 클래스는 커피와 차의 제조 과정을 정의한 클래스입니다. prepareRecipe 메서드는 커피와 차의 제조 과정을 정의하고 있으며, 이 메서드는 물을 끓이고, 물을 어떤 재료에 붓는 두 단계를 포함하고 있습니다.

이제 이 클래스를 상속받아 커피와 차의 구체적인 제조 과정을 구현할 수 있습니다. 예를 들어, 커피의 제조 과정을 구현하는

Coffee 클래스는 다음과 같이 구현할 수 있습니다.

 

public class Coffee extends CaffeineBeverage {
  public void brew() {
    System.out.println("Dripping coffee through filter");
  }

  public void addCondiments() {
    System.out.println("Adding sugar and milk");
  }
}

 

Coffee 클래스는 CaffeineBeverage 클래스를 상속받아 구현하고 있으며, brew 메서드와 addCondiments 메서드를 재정의하여 커피의 제조 과정을 구현하고 있습니다.

마찬가지로 차의 제조 과정을 구현하는 Tea 클래스도 다음과 같이 구현할 수 있습니다.

 

public class Tea extends CaffeineBeverage {
  public void brew() {
    System.out.println("Steeping the tea");
  }

  public void addCondiments() {
    System.out.println("Adding lemon");
  }
}

 

Tea 클래스는 CaffeineBeverage 클래스를 상속받아 구현하고 있으며, brew 메서드와 addCondiments 메서드를 재정의하여 차의 제조 과정을 구현하고 있습니다.

위와 같이 구현한 Coffee 클래스와 Tea 클래스를 사용하는 예는 다음과 같습니다.

 

CaffeineBeverage coffee = new Coffee();

위의 코드에서 CaffeineBeverage 타입의 변수 coffee는 Coffee 클래스의 인스턴스를 참조하고 있습니다. 이 변수를 통해 prepareRecipe 메서드를 호출하면 Coffee 클래스에서 재정의한 brew 메서드와 addCondiments 메서드가 호출되고, 커피의 제조 과정이 수행됩니다.

마찬가지로 CaffeineBeverage 타입의 변수 tea는 Tea 클래스의 인스턴스를 참조하고 있습니다. 이 변수를 통해 prepareRecipe 메서드를 호출하면 Tea 클래스에서 재정의한 brew 메서드와 addCondiments 메서드가 호출되고, 차의 제조 과정이 수행됩니다.

이렇게 CaffeineBeverage 클래스에서 알고리즘의 구조를 정의하고, Coffee 클래스와 Tea 클래스에서 이 알고리즘의 일부를 구현함으로써 커피와 차의 제조 과정을 쉽게 재사용할 수 있습니다.

 

템플릿 메서드 패턴을 적용함으로써 일반적인 알고리즘의 구조를 정의하고, 개별적인 단계를 서브클래스에서 구현할 수 있는 유연한 알고리즘을 작성할 수 있습니다. 또한 서브클래스는 알고리즘의 구조를 변경하지 않고도 개별적인 단계를 재정의할 수 있어 알고리즘을 재사용하기 쉬워집니다.

그러나 템플릿 메서드 패턴은 서브클래스가 추상 메서드를 구현해야 한다는 점에서 장단점이 있습니다. 서브클래스가 추상 메서드를 구현하지 않으면 컴파일 시점에 에러가 발생합니다. 따라서 템플릿 메서드 패턴을 적용할 때는 추상 메서드를 적절하게 구현할 수 있는지 고려해야 합니다.

또한 템플릿 메서드 패턴을 사용하면 추상 클래스가 많이 생성되기 때문에 코드의 복잡도가 증가할 수 있습니다. 그러므로 템플릿 메서드 패턴을 적용할 때는 코드의 구조를 잘 설계하여 코드의 복잡도를 줄일 수 있도록 해야 합니다.

종합하여 템플릿 메서드 패턴은 알고리즘의 구조를 정의하고, 개별적인 단계를 서브클래스에서 구현할 수 있는 유연한 알고리즘을 작성할 수 있는 패턴입니다. 하지만 서브클래스가 추상 메서드를 구현해야 하는 점과 코드의 복잡도가 증가할 수 있는 점을 고려해야 합니다.

 

'디자인 패턴' 카테고리의 다른 글

개발 일상, 소소한 리팩토링 정리  (0) 2024.01.11
파이브 라인즈 오브 코드 정리  (0) 2024.01.11