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

Composite - дерево об'єктів

Composite дозволяє працювати з деревом об'єктів так само, як з одним об'єктом: і окремий "лист", і "гілка" (група) реалізують той самий інтерфейс.

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

Ієрархічні структури (меню з підменю, дерева категорій, кошик із бандлами) змушують клієнтський код постійно розрізняти "це одиничний елемент чи група?" і писати окремі гілки для кожного випадку та ручну рекурсію обходу.

Як вирішує

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

У прикладі нижче і окремий товар (ProductItem), і набір товарів (Bundle) вміють рахувати total(). Бандл рахує суму своїх дітей, які теж можуть бути бандлами - глибина дерева не обмежена.

interface CartItem
{
  public function total(): int;
}

class ProductItem implements CartItem
{
  public function __construct(private int $price) {}

  public function total(): int
  {
    return $this->price;
  }
}

class Bundle implements CartItem
{
  private array $items = [];

  public function add(CartItem $item): void
  {
    $this->items[] = $item;
  }

  public function total(): int
  {
    return array_sum(array_map(
      fn (CartItem $item) => $item->total(),
      $this->items
    ));
  }
}

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

  • Деревоподібні структури: меню та підменю, дерева категорій, вкладені права доступу, кошик із бандлами, UI-компоненти.
  • Скрізь, де хочеться однакової логіки для одиничного елемента і групи.

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

  • + Клієнтський код не відрізняє лист від групи - логіка однакова на всіх рівнях.
  • + Нові типи елементів додаються без змін у клієнті.
  • Спільний інтерфейс інколи доводиться "розмивати" (методи додавання дітей не мають сенсу для листа).
  • Надлишковий, якщо структура завжди пласка - вистачить звичайної колекції.
94

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

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

8 / 23

Коментарі

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

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

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

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

Respect.Studio Нова
Сьогодні

Strong Middle PHP Engineer (Lviv or Odesa preferred)

Розробник backend на Laravel для платформи маркетингової автоматизації DemandSense. Потрібен досвід роботи з PostgreSQL, AWS (EC2, S3, RDS, Lambda), інтеграцією сторонніх API та великими обсягами даних. Вимагається проактивність, знання Git, CI/CD та англійська мова.

Alcor Нова
Сьогодні

PHP Tech Lead

Технічний лідер для платформи управління контрактниками (Alcor OS). Розроблення архітектури, керування продакшном та менторство команди з 4 інженерів. Стек: PHP/Laravel з DDD, CQRS, Event Sourcing, AWS, Terraform, MySQL. Вимоги: 4+ років Tech Lead/архітектором, 8+ років PHP, глибокі знання системного дизайну та моделювання даних, дисципліна тестування (TDD), робота з AI-кодом.

airSlate Нова
Вчора

Senior PHP Engineer

Розробка backend-функцій та API для платформи управління юридичними документами з використанням PHP/Laravel. Вимагається 3+ років досвіду розробки, глибоке знання PHP/Laravel, REST API, SQL/MySQL, AWS. Потрібна здатність інтегрувати AI-інструменти у робочий процес, базові знання React та Python, англійська B1+.

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

Bagisto

bagisto/bagisto

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

27,884 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,775 15.33.2 8

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