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

Когда применяется паттерн проектирования Стратегия?

2.0 Middle🔥 131 комментариев
#Архитектура и паттерны

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Когда применяется паттерн проектирования Стратегия?

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

Ключевые ситуации применения

1. Когда есть несколько вариантов одного алгоритма

Если в системе существует несколько способов выполнения одной операции (например, сортировка, валидация, форматирование данных), и выбор конкретного способа зависит от контекста, Стратегия идеально подходит. Вместо использования условных операторов (if/else или switch), каждый алгоритм выносится в отдельный класс, что упрощает добавление новых вариантов.

Пример: система расчета доставки с разными методами (курьер, почта, самовывоз).

interface DeliveryStrategy {
    public function calculateCost(float $weight, string $destination): float;
}

class CourierDelivery implements DeliveryStrategy {
    public function calculateCost(float $weight, string $destination): float {
        return $weight * 10 + 50;
    }
}

class PostalDelivery implements DeliveryStrategy {
    public function calculateCost(float $weight, string $destination): float {
        return $weight * 5 + 20;
    }
}

class DeliveryContext {
    private DeliveryStrategy $strategy;
    
    public function __construct(DeliveryStrategy $strategy) {
        $this->strategy = $strategy;
    }
    
    public function calculate(float $weight, string $destination): float {
        return $this->strategy->calculateCost($weight, $destination);
    }
}

2. Для замены громоздких условных конструкций

Когда в коде накапливаются сложные ветвления для выбора поведения, Стратегия помогает заменить их на набор объектов. Это улучшает читаемость, тестируемость и соответствие принципу Open/Closed (система открыта для расширения, но закрыта для изменений).

3. При необходимости динамического изменения поведения объекта

Если объект должен менять свое поведение во время выполнения (например, переключение режимов оплаты в корзине покупок), Стратегия позволяет подставлять нужный алгоритм "на лету". Клиентский код не зависит от конкретных реализаций, работая через общий интерфейс.

class ShoppingCart {
    private PaymentStrategy $paymentStrategy;
    
    public function setPaymentStrategy(PaymentStrategy $strategy): void {
        $this->paymentStrategy = $strategy;
    }
    
    public function checkout(float $amount): void {
        $this->paymentStrategy->pay($amount);
    }
}

4. Для изоляции логики алгоритмов от бизнес-логики

Когда алгоритмы содержат сложную или часто меняющуюся логику (например, парсинг данных из разных форматов), их вынесение в отдельные классы-стратегии предотвращает "разбухание" основного класса. Это способствует соблюдению принципа единственной ответственности (Single Responsibility Principle).

5. В тестировании и mock-объектах

Стратегия упрощает модульное тестирование, так как каждый алгоритм можно тестировать изолированно. Также легко подменять реальные алгоритмы на заглушки (mocks) в тестовом окружении.

Преимущества использования паттерна

  • Устранение дублирования кода: общая логика выносится в интерфейс.
  • Гибкость и расширяемость: новые стратегии добавляются без изменения существующего кода.
  • Упрощение поддержки: код становится более модульным и понятным.
  • Соблюдение SOLID: особенно принципов Open/Closed и Dependency Inversion.

Ограничения и альтернативы

Паттерн может излишне усложнить систему, если алгоритмов мало и они редко меняются. В таких случаях подойдут простые условные операторы или паттерн Состояние (State), который меняет поведение в зависимости от внутреннего состояния объекта (в отличие от Стратегии, где изменение поведения инициируется клиентом).

Вывод: Стратегия особенно полезна в системах, где требуется вариативность алгоритмов, их частое расширение и динамический выбор. В PHP-разработке она часто применяется в компонентах фреймворков (например, для драйверов кэширования, аутентификации или работы с файловыми хранилищами).

Когда применяется паттерн проектирования Стратегия? | PrepBro