fork download
  1. from abc import ABCMeta, abstractmethod
  2.  
  3.  
  4. class IStrategy(metaclass=ABCMeta):
  5. """ Класс реализующий конкретную стратегию, должен наследовать этот абстрактный класс
  6. Класс контекста использует этот абстрактный класс для вызова конкретной стратегии """
  7.  
  8. @abstractmethod
  9. def algorithm(self) -> None:
  10. pass
  11.  
  12.  
  13. class ConcreteStrategy1(IStrategy):
  14. """ Первая конкретная реализация-стратегия. """
  15.  
  16. def algorithm(self) -> None:
  17. print("Выполняется алгоритм стратегии 1")
  18.  
  19.  
  20. class ConcreteStrategy2(IStrategy):
  21. """ Вторая конкретная реализация-стратегия.
  22. (P.S. Реализаций может быть сколько угодно много.) """
  23.  
  24. def algorithm(self) -> None:
  25. print("Выполняется алгоритм стратегии 2")
  26.  
  27.  
  28. class Context:
  29. """ Контекст, использующий стратегию для решения своей задачи. """
  30.  
  31. def __init__(self, strategy: 'class') -> None:
  32. """ Конструктор контекста.
  33. Инициализирует объект стратегией.
  34. :type strategy: class"""
  35. self.strategy = strategy
  36.  
  37. def set_strategy(self, strategy: 'class') -> None:
  38. """ Метод для установки стратегии.
  39. Служит для смены стратегии во время выполнения.
  40. :type strategy: class"""
  41. self.strategy = strategy
  42.  
  43. def execute_operation(self) -> None:
  44. """ Некоторая функциональность контекста, которая выбирает
  45. стратегию и использует её для решения своей задачи."""
  46. self.strategy.algorithm(self)
  47.  
  48.  
  49. if __name__ == '__main__':
  50. context = Context(ConcreteStrategy1)
  51. context.execute_operation()
  52.  
  53. context = Context(ConcreteStrategy2)
  54. context.execute_operation()
  55.  
  56. print(Context.set_strategy.__annotations__)
  57.  
  58.  
Success #stdin #stdout 0.04s 9336KB
stdin
Standard input is empty
stdout
Выполняется алгоритм стратегии 1
Выполняется алгоритм стратегии 2
{'return': None, 'strategy': 'class'}