템플릿 메서드 패턴은 객체지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로, 알고리즘의 구조를 정의하는데 사용됩니다. 이 패턴은 알고리즘의 일부분을 서브클래스로 위임하여 구체화하고, 전체 알고리즘의 구조는 유지한 채 서브클래스에서 구체화된 부분을 변경할 수 있도록 합니다. 이를 통해 코드의 재사용성과 확장성을 높일 수 있습니다.
템플릿 메서드 패턴은 다음과 같은 구성 요소로 이루어져 있습니다
- AbstractClass(추상 클래스):
- 알고리즘의 구조를 정의하는 추상 클래스입니다.
- 템플릿 메서드를 포함하며, 이 메서드는 알고리즘의 일련의 단계를 정의합니다.
- 추상 메서드 또는 구현된 메서드를 사용하여 알고리즘의 각 단계를 정의합니다.
- ConcreteClass(구체 클래스):
- 추상 클래스를 상속받아 구현된 클래스입니다.
- 추상 클래스에서 정의된 추상 메서드를 구현하여 알고리즘의 구체적인 단계를 채웁니다.
템플릿 메서드 패턴은 다음과 같은 특징을 가지고 있습니다
- 코드의 재사용성: 알고리즘의 구조는 추상 클래스에 의해 정의되므로, 이 구조를 필요에 따라 여러 클래스에서 재사용할 수 있습니다.
- 확장성: 알고리즘의 구조는 변경하지 않고, 추상 클래스를 상속받아 구체 클래스를 작성함으로써 알고리즘의 특정 부분을 확장할 수 있습니다.
- Hollywood Principle: "누구에게서도 전화하지 마세요. 저희가 연락 드리겠습니다."라는 문구를 가진 전화관련 광고에서 유래한 개념으로, 추상 클래스가 구체 클래스에 연락을 취하고 필요한 메서드를 호출하는 방식입니다. 추상 클래스가 구체 클래스에 대해 의존성을 가지며, 구체 클래스는 추상 클래스의 메서드를 오버라이딩하여 구현합니다.
템플릿 메서드 패턴은 프레임워크나 라이브러리 등에서 널리 사용되며, 알고리즘의 공통 부분을 한 곳에서 관리하고 나머지 부분을 유연하게 변경할 수 있게 해줍니다.
템플릿 메서드 패턴은 추상 클래스를 활용하여 알고리즘의 구조를 정의하고, 일부 구현을 서브클래스에게 위임하는 디자인 패턴입니다. 이 패턴을 사용하면 알고리즘의 구조를 변경하지 않고도 서브클래스에서 특정 단계의 구현을 다르게 할 수 있습니다.
다음은 템플릿 메서드 패턴을 사용하여 커피를 만드는 예시 코드입니다.
abstract class CaffeineBeverage {
// 템플릿 메서드
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew(); // 추상 메서드
abstract void addCondiments(); // 추상 메서드
void boilWater() {
System.out.println("물 끓이는 중");
}
void pourInCup() {
System.out.println("컵에 따르는 중");
}
}
class Coffee extends CaffeineBeverage {
void brew() {
System.out.println("필터를 통해 커피 내리는 중");
}
void addCondiments() {
System.out.println("설탕과 우유를 추가하는 중");
}
}
class Tea extends CaffeineBeverage {
void brew() {
System.out.println("차를 우려내는 중");
}
void addCondiments() {
System.out.println("레몬을 추가하는 중");
}
}
public class TemplateMethodPatternExample {
public static void main(String[] args) {
CaffeineBeverage coffee = new Coffee();
coffee.prepareRecipe();
System.out.println();
CaffeineBeverage tea = new Tea();
tea.prepareRecipe();
}
}
위 예시 코드에서 CaffeineBeverage는 추상 클래스로서 템플릿 메서드 prepareRecipe()를 가지고 있습니다. prepareRecipe() 메서드는 커피나 차를 만드는 과정을 담고 있는 알고리즘의 구조를 정의하고 있습니다.
brew()와 addCondiments()는 추상 메서드로, 각각의 서브클래스에서 해당 단계의 구체적인 구현을 제공해야 합니다. Coffee 클래스와 Tea 클래스는 CaffeineBeverage를 상속받고, 각각 brew()와 addCondiments() 메서드를 구현하고 있습니다.
main() 메서드에서는 커피와 차를 만들기 위해 prepareRecipe() 메서드를 호출합니다. prepareRecipe() 메서드는 템플릿 메서드이므로 알고리즘의 구조는 고정되어 있지만, 실제 실행은 구현체 클래스에서 진행됩니다.
" 위 코드를 요약하자면, "
- 미리 정의된 일부 코드를 재활용하고,
- 구현체 클래스에서는 변화가 필요한 부분만 작성 후
- 클래스 인스턴스는 두가지 재활용 코드와 변화가 필요한 코드가 결합하여 실행되는 구조
입니다.