Назад к вопросам
Middle
95
questionbank
Что такое паттерн Стратегия (Strategy) и как он используется в программировании?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Паттерн Стратегия (Strategy) — это поведенческий паттерн проектирования, который определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Он позволяет клиенту менять алгоритм независимо от контекста его использования.
Основные компоненты паттерна:
- Strategy (Стратегия): Интерфейс или абстрактный класс, объявляющий общий метод для всех поддерживаемых алгоритмов.
- Concrete Strategy (Конкретная Стратегия): Классы, реализующие интерфейс Strategy и содержащие конкретную реализацию определенного алгоритма.
- Context (Контекст): Класс, который содержит ссылку на объект типа Strategy и делегирует ему выполнение алгоритма. Контекст не знает specifics конкретной стратегии, он работает только с интерфейсом Strategy.
Как используется:
- Определяется семейство связанных алгоритмов.
- Создается интерфейс или абстрактный класс Strategy, который определяет единый метод для выполнения этих алгоритмов.
- Создаются Concrete Strategy классы, реализующие этот интерфейс/абстрактный класс и содержащие конкретные реализации алгоритмов.
- Создается класс Context, который имеет поле для хранения ссылки на объект Strategy и метод для выполнения алгоритма, делегируя вызов этому объекту.
- Клиентский код создает объекты 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)