Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти
Інше
Події Про нас
Посібники 31 липня 2026

Strategy - вибір поведінки

Strategy виносить взаємозамінні алгоритми в окремі класи за спільним інтерфейсом, щоб підставляти їх без зміни клієнта.

Яку проблему вирішує

Коли одну дію можна виконати різними способами (тарифи, доставка, знижки, фільтри), вибір через if/switch робить сервіс громіздким. Кожен новий варіант - правка цього сервісу й ризик зачепити сусідні гілки.

Як вирішує

Кожен алгоритм інкапсулюється в окремому класі зі спільним інтерфейсом. Сервіс працює з інтерфейсом і не знає деталей. У Laravel зручно обирати стратегію через контейнер або конфіг - тоді заміна логіки відбувається без правок сервісу.

interface PriceStrategy
{
  public function calc($order);
}

class RetailPrice implements PriceStrategy
{
  public function calc($order)
  {
    return $order->total;
  }
}

class VipPrice implements PriceStrategy
{
  public function calc($order)
  {
    return $order->total * 0.9;
  }
}

class OrderService
{
  public function __construct(private PriceStrategy $strategy) {}

  public function total($order)
  {
    return $this->strategy->calc($order);
  }
}

app()->bind(PriceStrategy::class, VipPrice::class);

Де застосовувати

  • Тарифи, способи доставки, знижки, фільтри - будь-яка дія з кількома варіантами виконання.
  • Коли набір алгоритмів розширюється й хочеться додавати їх без правок наявного коду.

Плюси та мінуси

  • + Прибирає каскади if/switch; кожен алгоритм тестується локально.
  • + Система розширюється новими стратегіями без ризику зламати наявні.
  • Більше класів і потреба десь обирати потрібну стратегію.
  • Для двох простих варіантів окремі класи - надмірність; вистачить match.
0

Ця стаття - частина серії

Патерни проєктування

21 / 21

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

Прихований N+1 у Livewire: реєстри на час запиту Рекомендовано
Посібники 28 липня 2026
Як будувався laravelukraine.com

Прихований N+1 у Livewire: реєстри на час запиту

Найпідступніше джерело зайвих запитів - список із однаковою кнопкою на кожній картці, де кожна тихо робить свій SELECT. Розбираємо, як per-request реєстр збирає сотні однакових перевірок в один запит, чому саме scoped(), і той самий патерн поза базою.

Вакансії за темою

PulsePaw Нова
Вчора

Junior Strong/Middle PHP developer

Розробник PHP/Laravel для фінтех-проекту на мікросервісній архітектурі. Відповідатиме за підтримку та покращення кодової бази, оптимізацію продуктивності, роботу з MySQL, Redis, черг. Потрібні 2+ роки комерційної розробки, 1+ років PHP (Laravel), розуміння OOP та SOLID, мінімальні знання HTML/CSS/JS.

AI-Assisted Developer

Розробник, який використовує Claude Code для реалізації фіч та виправлення багів на B2B2C-платформі. Стек: PHP/Laravel (бекенд), Vue.js (фронтенд), REST API. Вимоги: базове розуміння веб-розробки, знайомство з PHP/JavaScript на рівні читання коду, практична робота з Git та AI-інструментами для кодингу, англійська B1+. Фокус на вмінні формулювати завдання для AI, перевіряти результати та інтегрувати в кодову базу.

Back-end розробник, програміст PHP (Laravel, Yii2)

Київ Офіс Full-time Middle від ₴60,000

PHP-розробник для розробки компонентів і модулів на Laravel та Yii2. Потрібні знання PHP, MySQL, ООП, патернів проектування та інтеграція із зовнішніми сервісами. Гнучкий графік, можливість професійного зростання.

Пакети за темою

Bagisto

bagisto/bagisto

Bagisto — це платформа для електронної комерції, побудована на Laravel. Вона надає готове рішення для створення та управління інтернет-магазинами з підтримкою каталогу товарів, замовлень, платежів та клієнтів.

27,769 v2.4.8 12 15

Lang

laravel-lang/lang

Список 126 мов для Laravel Framework, Laravel Jetstream, Laravel Fortify, Laravel Breeze, Laravel Cashier, Laravel Nova, Laravel Spark та Laravel UI.

7,779 15.33.1 8

Відео за темою