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

Visitor - операції над структурами

Visitor дозволяє додавати нові операції над набором об'єктів, не змінюючи самі їхні класи.

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

Над набором різнотипних об'єктів (дерево, AST, доменні моделі) треба виконувати багато різних операцій - підрахунок податку, експорт, валідацію. Якщо тримати кожну операцію методом у класах, моделі захаращуються, а нова операція зачіпає їх усі.

Як вирішує

Логіка операції виноситься в окремий клас-відвідувач із методом на кожен тип об'єкта. Об'єкти лише "приймають" візитора через accept() і викликають відповідний метод. Нову операцію додаєш одним новим візитором, не торкаючись класів об'єктів.

interface Visitable
{
  public function accept(Visitor $visitor): void;
}

interface Visitor
{
  public function visitOrder(Order $order): void;
}

class Order implements Visitable
{
  public function __construct(public int $total) {}

  public function accept(Visitor $visitor): void
  {
    $visitor->visitOrder($this);
  }
}

class TaxVisitor implements Visitor
{
  public function visitOrder(Order $order): void
  {
    $order->total += 10;
  }
}

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

  • Дерева об'єктів, AST, складні доменні моделі, над якими треба багато різних дій.
  • Коли операцій значно більше, ніж типів об'єктів, і набір типів стабільний.

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

  • + Нова операція - один новий візитор, без змін у класах об'єктів.
  • + Споріднені операції зібрані разом, а не розмазані по моделях.
  • Більше класів і непрямий код.
  • Новий тип об'єкта вимагає оновити всіх візиторів; якщо типи часто змінюються - Visitor стає тягарем, простіше тримати метод прямо в класі.
1

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

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

23 / 23

Коментарі

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

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

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

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

airSlate Нова
Вчора

Senior PHP Engineer

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

S-PRO Нова
Вчора

Senior PHP Engineer

Старший PHP-розробник для модернізації великомасштабної платформи онлайн-маркетплейсу. Займатиметься рефакторингом legacy-коду, міграцією на сучасні версії PHP та Laravel, оптимізацією продуктивності. Вимагається 8+ років досвіду з PHP, Laravel, MySQL, Docker, Redis; здатність перевіряти та покращувати AI-згенерований код.

НК Нова
Вчора

Head of IT

Керівник IT-напрямку в фінансовій компанії. Відповідальність за інфраструктуру (24/7 стабільність, VMware/Hyper-V), розробку продуктів (CRM, REST/SOAP інтеграції), кібербезпеку та комплаєнс НБУ, управління IT-командою. Вимоги: 2+ років на керівних позиціях,技нічна освіта, досвід з PHP/Laravel, MS SQL/PostgreSQL, архітектури мереж.

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

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

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