Вопрос проверяет знание популярных паттернов и умение объяснить один из них — «Стратегия» — в деталях.
Чаще всего применяют паттерны: Фабрика, Стратегия, Адаптер, Декоратор, Одиночка, Фасад, Наблюдатель, Команда, Репозиторий (вне GoF). Паттерн «Стратегия» позволяет менять алгоритм поведения объекта во время выполнения, помещая алгоритмы в отдельные классы и подменяя их через общий интерфейс. Это убирает громоздкие if/else и даёт возможность расширять систему новыми вариантами поведения без изменения существующего кода.
Существует 23 паттерна GoF, но на практике чаще применяют определённые группы.
Порождающие
Factory Method
Abstract Factory
Singleton
Builder
Структурные
Adapter
Decorator
Facade
Composite
Proxy
Поведенческие
Strategy
Observer
Command
Iterator
State
Эти паттерны наиболее востребованы в бизнес-логике, работе с API, интеграциях и сложных архитектурах.
Определение: Стратегия — это паттерн, который выносит алгоритм поведения в отдельный объект и позволяет менять его динамически через общий интерфейс.
Без стратегии код выглядит так:
php
class Payment {
public function pay(int $amount, string $method) {
if ($method === 'paypal') { /* paypal */ }
elseif ($method === 'stripe') { /* stripe */ }
elseif ($method === 'qiwi') { /* qiwi */ }
}
}
Минусы:
растущие if/else
нарушение OCP
тяжело тестировать
каждая новая логика — изменение класса
Определяем общий интерфейс:
php
interface PaymentStrategy {
public function pay(int $amount): void;
}
Создаём реализации:
php
class PaypalPayment implements PaymentStrategy {
public function pay(int $amount): void { /* ... */ }
}
class StripePayment implements PaymentStrategy {
public function pay(int $amount): void { /* ... */ }
}
Контекст, использующий стратегию:
php
class PaymentService {
public function __construct(private PaymentStrategy $strategy) {}
public function process(int $amount): void {
$this->strategy->pay($amount);
}
}
Использование:
php
$service = new PaymentService(new PaypalPayment());
$service->process(100);
можно подменить стратегию на лету
код расширяется добавлением новых стратегий
контекст остаётся неизменным
тестирование упрощено (можно подставлять мок-стратегии)
выбор метода оплаты
паттерны сортировок
различные способы сериализации (JSON/XML/Protobuf)
расчёт скидок или налоговых правил
выбор канала доставки уведомлений
Паттерн «Стратегия» делает систему расширяемой без модификации существующего кода, особенно когда поведение зависит от множества вариаций — это один из самых практичных и популярных поведенческих паттернов.