Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про PHP: strategy, pattern

Какие паттерны проектирования GoF используются на практике и как подробно работает паттерн «Стратегия»?

Вопрос проверяет знание популярных паттернов и умение объяснить один из них — «Стратегия» — в деталях.

Короткий ответ

Чаще всего применяют паттерны: Фабрика, Стратегия, Адаптер, Декоратор, Одиночка, Фасад, Наблюдатель, Команда, Репозиторий (вне GoF). Паттерн «Стратегия» позволяет менять алгоритм поведения объекта во время выполнения, помещая алгоритмы в отдельные классы и подменяя их через общий интерфейс. Это убирает громоздкие if/else и даёт возможность расширять систему новыми вариантами поведения без изменения существующего кода.

Длинный ответ

Паттерны GoF и паттерн «Стратегия»

Существует 23 паттерна GoF, но на практике чаще применяют определённые группы.

1. Наиболее используемые паттерны GoF

  1. Порождающие

    • Factory Method

    • Abstract Factory

    • Singleton

    • Builder

  2. Структурные

    • Adapter

    • Decorator

    • Facade

    • Composite

    • Proxy

  3. Поведенческие

    • Strategy

    • Observer

    • Command

    • Iterator

    • State

Эти паттерны наиболее востребованы в бизнес-логике, работе с API, интеграциях и сложных архитектурах.


Подробно: паттерн «Стратегия»

Определение: Стратегия — это паттерн, который выносит алгоритм поведения в отдельный объект и позволяет менять его динамически через общий интерфейс.

2. Проблема, которую решает Стратегия

Без стратегии код выглядит так:

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

  • тяжело тестировать

  • каждая новая логика — изменение класса

3. Как работает Стратегия

  1. Определяем общий интерфейс:

php

interface PaymentStrategy {
    public function pay(int $amount): void;
}
  1. Создаём реализации:

php

class PaypalPayment implements PaymentStrategy {
    public function pay(int $amount): void { /* ... */ }
}

class StripePayment implements PaymentStrategy {
    public function pay(int $amount): void { /* ... */ }
}
  1. Контекст, использующий стратегию:

php

class PaymentService {
    public function __construct(private PaymentStrategy $strategy) {}

    public function process(int $amount): void {
        $this->strategy->pay($amount);
    }
}
  1. Использование:

php

$service = new PaymentService(new PaypalPayment());
$service->process(100);

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

  • можно подменить стратегию на лету

  • код расширяется добавлением новых стратегий

  • контекст остаётся неизменным

  • тестирование упрощено (можно подставлять мок-стратегии)

4. Где применяется стратегия

  • выбор метода оплаты

  • паттерны сортировок

  • различные способы сериализации (JSON/XML/Protobuf)

  • расчёт скидок или налоговых правил

  • выбор канала доставки уведомлений

5. Вывод

Паттерн «Стратегия» делает систему расширяемой без модификации существующего кода, особенно когда поведение зависит от множества вариаций — это один из самых практичных и популярных поведенческих паттернов.

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • PHP

    PHP

Ключевые слова

#strategy

#pattern

Подпишись на PHP Developer в телеграм

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.