반응형

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

개요

템플릿 메서드 패턴은 객체 지향 설계에서 알고리즘의 구조를 정의하면서도, 하위 클래스에서 특정 단계를 재정의할 수 있도록 허용하는 패턴 입니다.

이 패턴은 일반적인 알고리즘의 골격을 상위 클래스에 정의하고, 구체적인 동작은 하위 클래스에서 구현하는 방식으로 작동합니다.

주요 특징

  • 코드 재사용: 알고리즘의 공통된 부분을 상위 클래스에서 정의하여 중복을 최소화합니다.
  • 유연성: 하위 클래스에서 특정 단계를 오버라이드하여 동작을 변경할 수 있습니다.
  • 알고리즘 캡슐화: 알고리즘의 고정된 구조를 상위 클래스에 두어 논리적 흐름이 변하지 않도록 보장합니다.

구조

  1. 추상 클래스:
    • 템플릿 메서드를 정의하며 알고리즘의 골격을 결정.
    • 구현되지 않은 추상 메서드(훅 메서드 포함)를 선언.
  2. 구체 클래스:
    • 추상 클래스의 메서드를 구현하거나 오버라이드하여 구체적 동작을 정의.

예제 코드

1. Python

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()

2. Java

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();
    }
}

3. C#

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();
    }
}

핵심 포인트

  1. 공통 알고리즘은 템플릿 메서드로 상위 클래스에서 정의.
  2. 단계별 구현은 하위 클래스에서 재정의.
  3. 반복적이고 공통적인 코드의 재사용이 용이하며, 확장성이 뛰어남.
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

+ Recent posts