← Назад ко всем вопросам

Паттерн: Стратегия (Strategy)

1️⃣ Как кратко ответить

Паттерн "Стратегия" — это поведенческий шаблон проектирования, который позволяет определить семейство алгоритмов, инкапсулировать их и сделать их взаимозаменяемыми. Это позволяет изменять алгоритмы независимо от клиентов, которые ими пользуются. В Python это часто реализуется через классы и интерфейсы.

2️⃣ Подробное объяснение темы

Паттерн проектирования "Стратегия" — это один из поведенческих паттернов, который помогает управлять алгоритмами и их изменениями. Он позволяет выбрать алгоритм на этапе выполнения, а не на этапе компиляции, что делает систему более гибкой и расширяемой.

Зачем это нужно?

Представьте, что у вас есть объект, который может выполнять определённую задачу несколькими способами. Например, у вас есть приложение для обработки изображений, и вы хотите предоставить пользователю возможность выбирать между различными алгоритмами фильтрации. Паттерн "Стратегия" позволяет вам легко переключаться между этими алгоритмами без изменения кода самого объекта.

Как работает?

Паттерн "Стратегия" включает в себя три основных компонента:

  1. Контекст: объект, который использует стратегию.
  2. Стратегия: интерфейс, который определяет метод, который будет использоваться.
  3. Конкретные стратегии: классы, реализующие интерфейс стратегии.

Пример на Python

from abc import ABC, abstractmethod
​
# Интерфейс стратегии
class Strategy(ABC):
    @abstractmethod
    def execute(self, data):
        pass
​
# Конкретная стратегия 1
class ConcreteStrategyA(Strategy):
    def execute(self, data):
        return sorted(data)
​
# Конкретная стратегия 2
class ConcreteStrategyB(Strategy):
    def execute(self, data):
        return sorted(data, reverse=True)
​
# Контекст
class Context:
    def __init__(self, strategy: Strategy):
        self._strategy = strategy
​
    def set_strategy(self, strategy: Strategy):
        self._strategy = strategy
​
    def execute_strategy(self, data):
        return self._strategy.execute(data)
​
# Пример использования
data = [5, 2, 9, 1]
​
context = Context(ConcreteStrategyA())
print("Ascending:", context.execute_strategy(data))
​
context.set_strategy(ConcreteStrategyB())
print("Descending:", context.execute_strategy(data))

Объяснение примера

  • Strategy: Это интерфейс, который определяет метод execute, который должны реализовать все стратегии.
  • ConcreteStrategyA и ConcreteStrategyB: Это конкретные реализации стратегии, которые сортируют данные по возрастанию и убыванию соответственно.
  • Context: Это класс, который использует стратегию. Он может менять стратегию в любое время с помощью метода set_strategy.

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

  • Гибкость: Легко добавлять новые стратегии без изменения существующего кода.
  • Расширяемость: Можно легко добавлять новые алгоритмы.
  • Поддержка принципа открытости/закрытости: Код открыт для расширения, но закрыт для модификации.

Недостатки

  • Усложнение кода: Может привести к увеличению количества классов.
  • Необходимость понимания: Требует понимания и правильного проектирования интерфейсов.

Тема: ООП
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки