C#으로 구현하는 템플릿 메서드 패턴: 알고리즘 골격 재사용하기

패턴 개요

템플릿 메서드 패턴은 행동 기반 디자인 패턴으로, 알고리즘의 전체 구조를 상위 클래스에서 정의하고 일부 변하는 단계들만 하위 클래스에 위임하는 설계 방식입니다. 동일한 프로세스를 따르지만 세부 구현이 다른 경우에 효과적입니다.

구성 요소

  • 추상 클래스: 알고리즘의 골격을 정의하는 템플릿 메서드와 하위 클래스가 구현해야 할 추상 연산을 포함합니다.
  • 구체 클래스: 추상 클래스에서 정의된 연산을 실제로 구현하여 특정한 행동을 제공합니다.

동작 원리

상위 클래스의 템플릿 메서드가 전체 실행 순서를 제어합니다. 공통되는 단계는 직접 구현하고, 변하는 부분은 추상 메서드로 선언하여 하위 클래스가 오버라이딩하도록 합니다. 이를 통해 알고리즘의 흐름은 유지하면서도 특정 단계의 구현은 유연하게 변경할 수 있습니다.

실제 구현 (C#)

다음은 음료 제조 과정을 템플릿 메서드 패턴으로 구현한 예제입니다.

기본 레시피: DrinkRecipe.cs

namespace TemplateMethodDemo;

abstract class DrinkRecipe
{
    protected string drinkName;
    
    public DrinkRecipe() => drinkName = "음료";
    
    public void CreateDrink()
    {
        HeatLiquid();
        MixMainIngredient();
        AddExtras();
        PourIntoGlass();
        Console.WriteLine($"{drinkName} 준비 완료!");
        Console.WriteLine(new string('=', 25));
    }
    
    protected void HeatLiquid() => Console.WriteLine("액체를 가열 중...");
    protected void PourIntoGlass() => Console.WriteLine($"{drinkName}를 잔에 따르는 중...");
    
    protected abstract void MixMainIngredient();
    protected abstract void AddExtras();
}

구체적인 레시피: ConcreteRecipes.cs

namespace TemplateMethodDemo;

class CoffeeRecipe : DrinkRecipe
{
    public CoffeeRecipe() => drinkName = "커피";
    
    protected override void MixMainIngredient()
    {
        Console.WriteLine("원두를 추출하는 중...");
    }
    
    protected override void AddExtras()
    {
        Console.WriteLine("설탕과 크림을 추가하는 중...");
    }
}

class SmoothieRecipe : DrinkRecipe
{
    public SmoothieRecipe() => drinkName = "스무디";
    
    protected override void MixMainIngredient()
    {
        Console.WriteLine("과일과 우유를 블렌딩 중...");
    }
    
    protected override void AddExtras()
    {
        Console.WriteLine("요거트를 추가하는 중...");
    }
}

실행 코드: Program.cs

using TemplateMethodDemo;

DrinkRecipe espresso = new CoffeeRecipe();
DrinkRecipe berrySmoothie = new SmoothieRecipe();

espresso.CreateDrink();
berrySmoothie.CreateDrink();

코드 분석

CreateDrink 메서드가 제조 과정의 흐름을 고정시키고, MixMainIngredientAddExtras는 음료 종류에 따라 달라지는 부분을 추상화했습니다. HeatLiquidPourIntoGlass는 모든 음료에 공통되어 하위 클래스에서 변경할 필요가 없습니다. 이 방식으로 알고리즘 구조는 재사용하면서도 세부 구현은 확장할 수 있습니다.

태그: TemplateMethodPattern DesignPattern csharp AbstractClass Inheritance

9월 19일 03:46에 게시됨