Паттерн Стратегия - поведенческий.
Меняет алгоритм (стратегию) в зависимости от запроса клиента.
Tip
Допустим у нас есть навигатор (интерфейс, через который мы будем обращаться к алгоритмам).
В навигаторе мы можем выбрать способ добраться до цели: машиной, велосипедом или автобусом.
После выбора одной реализации из множества, выполняем ее и выводим ее результат.
Important
ВАЖНО: Сам навигатор не знает, какой способ добраться он сейчас реализует и вызывает. Он просто получает стратегию и говорит ей выполниться.
from abc import ABC, abstractmethod
class RouteStrategy(ABC):
@abstractmethod
def build_route(self, start, end):
pass
class CarRoute(RouteStrategy):
def build_route(self, start, end):
print(f"Машиной от {start} до {end}.")
class BikeRoute(RouteStrategy):
def build_route(self, start, end):
print(f"Велосипедом от {start} до {end}.")
class BusRoute(RouteStrategy):
def build_route(self, start, end):
print(f"Автобусом от {start} до {end}.")
class Navigator:
def __init__(self, strategy: RouteStrategy):
self.strategy = strategy
def set_strategy(self, strategy: RouteStrategy):
self.strategy = strategy
def navigate(self, start, end):
self.strategy.build_route(start, end)
navigator = Navigator(CarRoute())
navigator.navigate("Дом", "Работа")
navigator.set_strategy(BikeRoute())
navigator.navigate("Парк", "Кафе")
navigator.set_strategy(BusRoute())
navigator.navigate("Университет", "Библиотека")
# output:
# Машиной от Дом до Работа.
# Велосипедом от Парк до Кафе.
# Автобусом от Университет до Библиотека.