톰플레이트 패턴은 객체 지향 디자인 패턴 중 하나로, 알고리즘의 구조를 메소드에 정의하고 일부를 서브클래싱하여 구현하는 방법입니다. 이 패턴은 특히 동일한 알고리즘의 다양한 변형이 필요한 경우 유용하게 사용됩니다.
패턴 개요
톰플레이트 패턴은 크게 두 가지 구성요소로 이루어져 있습니다:
-
AbstractClass(추상 클래스): 알고리즘의 구조를 정의하는 클래스로, 일련의 메소드들을 포함합니다. 일부 메소드는 추상 메소드로 선언되거나 기본 구현을 제공할 수 있습니다.
-
ConcreteClass(구체 클래스): 추상 클래스를 상속받아 알고리즘의 특정 부분을 구체화합니다. 이 클래스는 추상 클래스의 추상 메소드를 구현해야 합니다.
예제
다음은 톰플레이트 패턴의 간단한 예제입니다. 우리는 커피를 만드는 알고리즘을 만들고, 이를 커피와 티로 구체화하는 클래스를 작성할 것입니다.
from abc import ABC, abstractmethod
class HotBeverage(ABC):
def prepare(self):
self.boil_water()
self.brew()
self.pour()
self.add_condiments()
def boil_water(self):
print("물 끓이는 중...")
@abstractmethod
def brew(self):
pass
def pour(self):
print("컵에 따르는 중...")
@abstractmethod
def add_condiments(self):
pass
class Coffee(HotBeverage):
def brew(self):
print("커피를 내리는 중...")
def add_condiments(self):
print("설탕과 우유를 추가하는 중...")
class Tea(HotBeverage):
def brew(self):
print("차를 우리는 중...")
def add_condiments(self):
print("레몬을 추가하는 중...")
위의 예제에서는 HotBeverage
클래스가 알고리즘의 구조를 정의하고, Coffee
와 Tea
클래스가 구체화를 수행합니다. HotBeverage
클래스의 prepare
메소드는 알고리즘을 정의하며, 이를 구현한 brew
와 add_condiments
메소드가 구체 클래스에서 구현됩니다.
사용 예시
이제 톰플레이트 패턴을 사용하여 커피와 티를 만들어봅시다. 다음은 사용 방법의 예시입니다:
coffee = Coffee()
coffee.prepare()
tea = Tea()
tea.prepare()
이 코드를 실행하면 다음과 같은 결과가 출력됩니다:
물 끓이는 중...
커피를 내리는 중...
컵에 따르는 중...
설탕과 우유를 추가하는 중...
물 끓이는 중...
차를 우리는 중...
컵에 따르는 중...
레몬을 추가하는 중...
결론
톰플레이트 패턴을 사용하면 알고리즘을 구조적으로 정의하고 일부를 서브클래싱하여 다양한 변형을 구현할 수 있습니다. 이 패턴은 코드 재사용성을 높이고 유지보수를 용이하게 만들어줍니다. 따라서 비슷한 알고리즘이 다양한 상황에서 사용되어야 하는 경우에는 톰플레이트 패턴을 고려해보세요. ```