Python에서 전략(Strategy) 패턴

sudal·2023년 10월 15일

전략 패턴이란?
하나의 문제를 해결하기 위해
알고리즘군을 정의하고 캡슐화하여 런타임시에 동적으로 적절한 알고리즘을 선택할 수 있도록 하는 행위 디자인 패턴 입니다.

코드를 통하여 살펴보겠습니다.

# 덕타이핑을 이용하지 않고 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()

0개의 댓글