Назад к вопросам
Middle
95
questionbank

Что такое паттерн Стратегия (Strategy) и как он используется в программировании?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Паттерн Стратегия (Strategy) — это поведенческий паттерн проектирования, который определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Он позволяет клиенту менять алгоритм независимо от контекста его использования.

Основные компоненты паттерна:

  • Strategy (Стратегия): Интерфейс или абстрактный класс, объявляющий общий метод для всех поддерживаемых алгоритмов.
  • Concrete Strategy (Конкретная Стратегия): Классы, реализующие интерфейс Strategy и содержащие конкретную реализацию определенного алгоритма.
  • Context (Контекст): Класс, который содержит ссылку на объект типа Strategy и делегирует ему выполнение алгоритма. Контекст не знает specifics конкретной стратегии, он работает только с интерфейсом Strategy.

Как используется:

  1. Определяется семейство связанных алгоритмов.
  2. Создается интерфейс или абстрактный класс Strategy, который определяет единый метод для выполнения этих алгоритмов.
  3. Создаются Concrete Strategy классы, реализующие этот интерфейс/абстрактный класс и содержащие конкретные реализации алгоритмов.
  4. Создается класс Context, который имеет поле для хранения ссылки на объект Strategy и метод для выполнения алгоритма, делегируя вызов этому объекту.
  5. Клиентский код создает объекты Context и Concrete Strategy, затем передает нужный объект Strategy в Context для выполнения конкретного алгоритма.

Преимущества:

  • Позволяет независимо менять алгоритмы без изменения кода Context.
  • Инкапсулирует каждый алгоритм в отдельный класс, что улучшает читаемость и модульность.
  • Позволяет легко добавлять новые алгоритмы.

Пример:

// Контекст
class Context:
    def __init__(self, strategy):
        self._strategy = strategy

    def execute_strategy(self, data):
        # Контекст делегирует выполнение стратегии
        return self._strategy.execute(data)

// Интерфейс Стратегии
class Strategy:
    def execute(self, data):
        # Абстрактный метод для выполнения алгоритма
        pass

// Конкретная Стратегия A
class ConcreteStrategyA(Strategy):
    def execute(self, data):
        # Реализация алгоритма A
        return f"Алгоритм A обработал данные: {data.upper()}"

// Конкретная Стратегия B
class ConcreteStrategyB(Strategy):
    def execute(self, data):
        # Реализация алгоритма B
        return f"Алгоритм B обработал данные: {data.lower()}"

// Клиентский код
if __name__ == "__main__":
    # Использование Стратегии A
    context_a = Context(ConcreteStrategyA())
    result_a = context_a.execute_strategy("Привет, Мир!")
    print(result_a)

    # Использование Стратегии B
    context_b = Context(ConcreteStrategyB())
    result_b = context_b.execute_strategy("ПРИВЕТ, МИР!")
    print(result_b)