Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Посібники 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 стає тягарем, простіше тримати метод прямо в класі.
12

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

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

23 / 34

  1. 1 Abstract Factory - сімейства об'єктів
  2. 2 Builder - поетапна побудова об'єктів
  3. 3 Factory Method - вибір створення
  4. 4 Prototype - швидке клонування
  5. 5 Singleton - один екземпляр
  6. 6 Adapter - узгодження інтерфейсів
  7. 7 Bridge - відокремлення абстракції
  8. 8 Composite - дерево об'єктів
  9. 9 Decorator - middleware як обгортка
  10. 10 Facade - спрощений доступ
  11. 11 Flyweight - спільні легкі об'єкти
  12. 12 Proxy - контроль доступу і кеш
  13. 13 Chain of Responsibility - ланцюжок обробників
  14. 14 Command - інкапсуляція дії
  15. 15 Interpreter - обробка власних правил
  16. 16 Iterator - контроль обходу
  17. 17 Mediator - координація взаємодії
  18. 18 Memento - збереження стану
  19. 19 Observer - реакція на події
  20. 20 State - поведінка залежно від стану
  21. 21 Strategy - вибір поведінки
  22. 22 Template Method - спільний алгоритм
  23. 23 Visitor - операції над структурами
  24. 24 Repository - доступ до даних
  25. 25 Service Layer - бізнес-логіка в одному місці
  26. 26 Dependency Injection - явні залежності
  27. 27 DTO - передача даних без логіки
  28. 28 MVC / MVP / MVVM - архітектурні підходи
  29. 29 CQRS - розділення читання і запису
  30. 30 Event Sourcing - події як джерело істини
  31. 31 Unit of Work - узгоджені зміни
  32. 32 Specification - правила як об'єкти
  33. 33 Pipeline - послідовна обробка
  34. 34 Null Object - поведінка за замовчуванням

Читати в документації

Коментарі

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

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

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

Патерн Null Object
Посібники 10 вересня 2026
Патерни проєктування

Null Object - поведінка за замовчуванням

Замінює null безпечним об'єктом із тим самим інтерфейсом і "порожньою" поведінкою. Прибирає перевірки на null - і де він може приховати справжню проблему.

5

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

PHP Software Engineer

Розробник PHP для розробки та оптимізації high-load backend-сервісів із використанням Laravel, Apache Kafka, RabbitMQ і Redis. Вимоги: 5+ років досвіду в backend-розробці в senior/lead ролі, експертне знання Laravel або Symfony, обов'язковий досвід із Kafka, Redis, мікросервісною архітектурою, Docker/Kubernetes. Необхідна базова підготовка у high-load системах та real-time обробці.

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

Backend Software Engineer

Розробник бекенду для розроблення та підтримки PHP-систем розподілених сервісів. Основний стек: PHP, OOP, API дизайн, базі даних (MySQL, PostgreSQL). Вимоги: 2+ роки досвіду бекенд-розробки на PHP, знання архітектурних паттернів, Git, CI/CD, контейнеризації. Nice-to-have: Laravel, Symfony, Docker, Kubernetes, Redis, RabbitMQ.

Global Logistics Нова
Сьогодні

Програміст PHP Full stack Developer

Розробник PHP (фулстек) для розробки та підтримки веб-додатків. Основний стек: PHP 7x/8x, MySQL, Yii 2.0, JavaScript, Vue.js, REST API. Вимоги: 3+ років досвіду на PHP, 2+ років з Yii 2.0, знання MySQL на просунутому рівні, Git, CSS, jQuery. Будуть плюсом: Laravel, Redis, WebSocket, RabbitMQ, Firebase. Робота над власними продуктами компанії (CRM логістичних процесів), робота у команді, code review.

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

Bagisto

bagisto/bagisto

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

28,130 v2.5.0-beta3 13 26

Lang

laravel-lang/lang

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

7,775 15.36.0 12