반응형
템플릿 메서드 패턴은 객체 지향 설계에서 알고리즘의 구조를 정의하면서도, 하위 클래스에서 특정 단계를 재정의할 수 있도록 허용하는 패턴 입니다.
이 패턴은 일반적인 알고리즘의 골격을 상위 클래스에 정의하고, 구체적인 동작은 하위 클래스에서 구현하는 방식으로 작동합니다.
- 코드 재사용: 알고리즘의 공통된 부분을 상위 클래스에서 정의하여 중복을 최소화합니다.
- 유연성: 하위 클래스에서 특정 단계를 오버라이드하여 동작을 변경할 수 있습니다.
- 알고리즘 캡슐화: 알고리즘의 고정된 구조를 상위 클래스에 두어 논리적 흐름이 변하지 않도록 보장합니다.
- 추상 클래스:
- 템플릿 메서드를 정의하며 알고리즘의 골격을 결정.
- 구현되지 않은 추상 메서드(훅 메서드 포함)를 선언.
- 구체 클래스:
- 추상 클래스의 메서드를 구현하거나 오버라이드하여 구체적 동작을 정의.
python
from abc import ABC, abstractmethod
class MealPreparation(ABC):
# 템플릿 메서드
def prepare_meal(self):
self.prepare_ingredients()
self.cook()
self.serve()
@abstractmethod
def prepare_ingredients(self):
pass
@abstractmethod
def cook(self):
pass
def serve(self):
print("음식을 서빙합니다.")
class KoreanMeal(MealPreparation):
def prepare_ingredients(self):
print("재료: 김치, 돼지고기, 고추장 준비.")
def cook(self):
print("재료를 볶아 김치찌개를 만듭니다.")
class ItalianMeal(MealPreparation):
def prepare_ingredients(self):
print("재료: 파스타, 토마토소스, 치즈 준비.")
def cook(self):
print("파스타를 삶고 소스를 조리합니다.")
# 사용
print("한국식 요리:")
meal = KoreanMeal()
meal.prepare_meal()
print("\n이탈리아 요리:")
meal = ItalianMeal()
meal.prepare_meal()
java
abstract class MealPreparation {
// 템플릿 메서드
public final void prepareMeal() {
prepareIngredients();
cook();
serve();
}
protected abstract void prepareIngredients();
protected abstract void cook();
protected void serve() {
System.out.println("음식을 서빙합니다.");
}
}
class KoreanMeal extends MealPreparation {
@Override
protected void prepareIngredients() {
System.out.println("재료: 김치, 돼지고기, 고추장 준비.");
}
@Override
protected void cook() {
System.out.println("재료를 볶아 김치찌개를 만듭니다.");
}
}
class ItalianMeal extends MealPreparation {
@Override
protected void prepareIngredients() {
System.out.println("재료: 파스타, 토마토소스, 치즈 준비.");
}
@Override
protected void cook() {
System.out.println("파스타를 삶고 소스를 조리합니다.");
}
}
// 사용
public class Main {
public static void main(String[] args) {
System.out.println("한국식 요리:");
MealPreparation koreanMeal = new KoreanMeal();
koreanMeal.prepareMeal();
System.out.println("\n이탈리아 요리:");
MealPreparation italianMeal = new ItalianMeal();
italianMeal.prepareMeal();
}
}
csharp
using System;
abstract class MealPreparation {
// 템플릿 메서드
public void PrepareMeal() {
PrepareIngredients();
Cook();
Serve();
}
protected abstract void PrepareIngredients();
protected abstract void Cook();
protected void Serve() {
Console.WriteLine("음식을 서빙합니다.");
}
}
class KoreanMeal : MealPreparation {
protected override void PrepareIngredients() {
Console.WriteLine("재료: 김치, 돼지고기, 고추장 준비.");
}
protected override void Cook() {
Console.WriteLine("재료를 볶아 김치찌개를 만듭니다.");
}
}
class ItalianMeal : MealPreparation {
protected override void PrepareIngredients() {
Console.WriteLine("재료: 파스타, 토마토소스, 치즈 준비.");
}
protected override void Cook() {
Console.WriteLine("파스타를 삶고 소스를 조리합니다.");
}
}
// 사용
class Program {
static void Main(string[] args) {
Console.WriteLine("한국식 요리:");
MealPreparation koreanMeal = new KoreanMeal();
koreanMeal.PrepareMeal();
Console.WriteLine("\n이탈리아 요리:");
MealPreparation italianMeal = new ItalianMeal();
italianMeal.PrepareMeal();
}
}
- 공통 알고리즘은 템플릿 메서드로 상위 클래스에서 정의.
- 단계별 구현은 하위 클래스에서 재정의.
- 반복적이고 공통적인 코드의 재사용이 용이하며, 확장성이 뛰어남.
- 패턴 목록은 다음 글을 참고하시기 바랍니다.
728x90
반응형
'Designing Software' 카테고리의 다른 글
레이어드 패턴 (Layered Pattern) (0) | 2024.11.17 |
---|---|
방문자(Visitor) 패턴 (0) | 2024.11.17 |
상태(State) 패턴 (0) | 2024.11.16 |
옵저버(Observer) 패턴 (0) | 2024.11.16 |
메멘토(Memento) 패턴 (0) | 2024.11.16 |