전략 패턴이란?
하나의 문제를 해결하기 위해
알고리즘군을 정의하고 캡슐화하여 런타임시에 동적으로 적절한 알고리즘을 선택할 수 있도록 하는 행위 디자인 패턴 입니다.
코드를 통하여 살펴보겠습니다.
# 덕타이핑을 이용하지 않고 abc 내장 모듈을 이용하여 구현한 예제입니다.
# 덕타이핑을 활용할 때 보다 코드를 많이 작성하게 됩니다.
import abc
class Algorithm(abc.ABC):
@abc.abstractmethod
def calculate_duration(self, start_point: str, end_point: str) -> str
...
class TaxiAlgorithm(Algorithm):
def calculate_duration(self, start_point: str, end_point: str) -> str
# start_point와 end_point를 이용하여 작업 수행
return f"{start_point}에서 {end_point}로 택시를 타고 가는데 걸리는 시간은 300분 입니다."
class KtxAlgorithm(Algorithm):
def calculate_duration(self, start_point: str, end_point: str) -> str
# start_point와 end_point를 이용하여 작업 수행
return f"{start_point}에서 {end_point}로 KTX를 타고 가는데 걸리는 시간은 180분 입니다."
class TravelTimeCalculator:
def __init__(self, algorithm: Algorithm) -> None:
self.algorithm = algorithm
def get_travel_time(self, start_point, end_point):
result = self.algorithm.calculate_duration(start_point, end_point)
return result
def main():
taxi_travel_time_calculator = TravelTimeCalculator(TaxiAlgorithm())
travel_time = taxi_travel_time_calculator.get_travel_time("서울", "부산")
print(travel_time)
ktx_travel_time_calculator = TravelTimeCalculator(KtxAlgorithm())
travel_time = ktx_travel_time_calculator.get_travel_time("서울", "부산")
print(travel_time)
if __name__ == "__main__":
main()
### 실행 결과 ###
서울에서 부산로 택시를 타고 가는데 걸리는 시간은 300분 입니다.
서울에서 부산로 KTX를 타고 가는데 걸리는 시간은 180분 입니다.
# 덕타핑을 활용한 예시 입니다.
# __call__ 매직 메서드를 활용하면 클래스를 호출가능한 함수로 변환시킬 수 있습니다.
# 덕타이핑을 활용하여 인터페이스를 상속받지 않고도 다형성을 구현할 수 있습니다.
# 이러한 특징을 활용하면 아래와 같이 구현이 가능합니다.
from typing import Callable
class TaxiAlgorithm:
def __call__(self, start_point: str, end_point: str) -> str:
# start_point와 end_point를 이용하여 작업 수행
return f"{start_point}에서 {end_point}로 택시를 타고 가는데 걸리는 시간은 300분 입니다."
class KtxAlgorithm:
def __call__(self, start_point: str, end_point: str) -> str:
# start_point와 end_point를 이용하여 작업 수행
return f"{start_point}에서 {end_point}로 KTX를 타고 가는데 걸리는 시간은 180분 입니다."
Algorithm = Callable[[str, str], int]
class TravelTimeCalculator:
def __init__(self, algorithm: Algorithm) -> None:
self.algorithm = algorithm
def get_travel_time(self, start_point, end_point) -> str:
result = self.algorithm(start_point, end_point)
return result
def main():
taxi_travel_time_calculator = TravelTimeCalculator(TaxiAlgorithm())
travel_time = taxi_travel_time_calculator.get_travel_time("서울", "부산")
print(travel_time)
ktx_travel_time_calculator = TravelTimeCalculator(KtxAlgorithm())
travel_time = ktx_travel_time_calculator.get_travel_time("서울", "부산")
print(travel_time)
if __name__ == "__main__":
main()