여러 알고리즘 또는 클래스가 비슷하거나 같은 로직을 구현할 때
알고리즘을 단계별로 서브클래스화해 코드의 중복을 줄일 수 있는 경우
서브클래스를 오버라이드해 여러 알고리즘을 구현할 수 있는 경우
커피 끓이는 순서
차를 끓이는 순서
=> 단계별로 구분 지어 생각해보면 공통점이 많다.
템플릿 메소드 패턴의 목적은 다음과 같다
템플릿 메소드 패턴에는 ABstractClass와 ConcreteClass, Template Method, Clinet가 있다.
여행사는 여러 여행지 중에 고객에 맞는 패키지를 만들어 추천한다. 패키지는 고객이 선택한다. 패키지에는 바우문할 장소들과 교통수단 등의 여러 정보와 일정이 있다. 같은 여행지라도 고객의 요구에 맞게 일정을 바꿀 수 있다.
시나리오
from abc import abstractmethod, ABCMeta
class Trip(metaclass=ABCMeta):
@abstractmethod
def setTransport(self):
pass
@abstractmethod
def day1(self):
pass
@abstractmethod
def day2(self):
pass
@abstractmethod
def day3(self):
pass
@abstractmethod
def returnHome(self):
pass
def itinerary(self):
self.setTransport()
self.day1()
self.day2()
self.day3()
self.returnHome()
구상클래스
class VeniceTrip(Trip):
def setTransport(self):
print("take a boat")
def day1(self):
print("visit a1")
def day2(self):
print("visit a2")
def day3(self):
print("visit a3")
def returnHome(self):
print("get back")
class MaldiversTrip(Trip):
def setTransport(self):
print("take a car")
def day1(self):
print("visit b1")
def day2(self):
print("visit b2")
def day3(self):
print("visit b3")
def returnHome(self):
print("go bus station")
활용 코드
class TravelAgency:
def arrage_trip(self):
choice = input("What kind of place you'd like to go historical or to beach")
if choice == 'historical':
self.trip = VeniceTrip()
self.trip.itinerary()
else:
self.trip = MaldiversTrip()
self.trip.itinerary()
TravelAgency().arrage_trip()
What kind of place you'd like to go historical or to beach : historical
take a car
visit b1
visit b2
visit b3
go bus station