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