---
title: "Visitor - операції над структурами"
url: https://laravelukraine.com/blog/visitor-operaciyi-nad-strukturami
date: 2026-08-07
---

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

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

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

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

### Як вирішує

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

```php
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 стає тягарем, простіше тримати метод прямо в класі.
