from abc import ABCMeta, abstractmethod
class IStrategy(metaclass=ABCMeta):
""" Класс реализующий конкретную стратегию, должен наследовать этот абстрактный класс
Класс контекста использует этот абстрактный класс для вызова конкретной стратегии """
@abstractmethod
def algorithm(self) -> None:
pass
class ConcreteStrategy1(IStrategy):
""" Первая конкретная реализация-стратегия. """
def algorithm(self) -> None:
print("Выполняется алгоритм стратегии 1")
class ConcreteStrategy2(IStrategy):
""" Вторая конкретная реализация-стратегия.
(P.S. Реализаций может быть сколько угодно много.) """
def algorithm(self) -> None:
print("Выполняется алгоритм стратегии 2")
class Context:
""" Контекст, использующий стратегию для решения своей задачи. """
def __init__(self, strategy: 'class') -> None:
""" Конструктор контекста.
Инициализирует объект стратегией.
:type strategy: class"""
self.strategy = strategy
def set_strategy(self, strategy: 'class') -> None:
""" Метод для установки стратегии.
Служит для смены стратегии во время выполнения.
:type strategy: class"""
self.strategy = strategy
def execute_operation(self) -> None:
""" Некоторая функциональность контекста, которая выбирает
стратегию и использует её для решения своей задачи."""
self.strategy.algorithm(self)
if __name__ == '__main__':
context = Context(ConcreteStrategy1)
context.execute_operation()
context = Context(ConcreteStrategy2)
context.execute_operation()
print(Context.set_strategy.__annotations__)