Паттерн: Стратегия (Strategy)
1️⃣ Как кратко ответить
Паттерн "Стратегия" — это поведенческий шаблон проектирования, который позволяет определить семейство алгоритмов, инкапсулировать их и сделать их взаимозаменяемыми. Это позволяет изменять алгоритмы независимо от клиентов, которые ими пользуются. В Python это часто реализуется через классы и интерфейсы.
2️⃣ Подробное объяснение темы
Паттерн проектирования "Стратегия" — это один из поведенческих паттернов, который помогает управлять алгоритмами и их изменениями. Он позволяет выбрать алгоритм на этапе выполнения, а не на этапе компиляции, что делает систему более гибкой и расширяемой.
Зачем это нужно?
Представьте, что у вас есть объект, который может выполнять определённую задачу несколькими способами. Например, у вас есть приложение для обработки изображений, и вы хотите предоставить пользователю возможность выбирать между различными алгоритмами фильтрации. Паттерн "Стратегия" позволяет вам легко переключаться между этими алгоритмами без изменения кода самого объекта.
Как работает?
Паттерн "Стратегия" включает в себя три основных компонента:
- Контекст: объект, который использует стратегию.
- Стратегия: интерфейс, который определяет метод, который будет использоваться.
- Конкретные стратегии: классы, реализующие интерфейс стратегии.
Пример на 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.
Преимущества
- Гибкость: Легко добавлять новые стратегии без изменения существующего кода.
- Расширяемость: Можно легко добавлять новые алгоритмы.
- Поддержка принципа открытости/закрытости: Код открыт для расширения, но закрыт для модификации.
Недостатки
- Усложнение кода: Может привести к увеличению количества классов.
- Необходимость понимания: Требует понимания и правильного проектирования интерфейсов.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться