TGViewer
Библиотека джависта | Java, Spring, Maven, Hibernate Библиотека джависта | Java, Spring, Maven, Hibernate @javaproglib · 22K subscribers
Post #7681 1.8K

Forwarded from Библиотека собеса по Java | вопросы с собеседований

❓ Расскажите о паттерне Visitor

Visitor — это поведенческий паттерн, который позволяет добавлять новые операции к объектам, не изменяя их классы.

Простыми словами: налоговый инспектор (visitor) приходит в разные компании и выполняет проверку — компании не меняются, а новые виды проверок добавляются легко.

▪️ Пример:

Система документооборота: есть разные типы документов, и нужно добавлять операции (экспорт, валидация, подсчёт статистики) без изменения классов документов.

// Visitor
interface DocumentVisitor {
void visit(Invoice invoice);
void visit(Contract contract);
void visit(Report report);
}

// Элементы
interface Document {
void accept(DocumentVisitor visitor);
}

class Invoice implements Document {
private final BigDecimal amount;
public Invoice(BigDecimal amount) { this.amount = amount; }
public BigDecimal getAmount() { return amount; }

public void accept(DocumentVisitor visitor) {
visitor.visit(this); // double dispatch
}
}

class Contract implements Document {
private final LocalDate expiryDate;
public Contract(LocalDate expiryDate) { this.expiryDate = expiryDate; }
public LocalDate getExpiryDate() { return expiryDate; }

public void accept(DocumentVisitor visitor) {
visitor.visit(this);
}
}

class Report implements Document {
private final int pageCount;
public Report(int pageCount) { this.pageCount = pageCount; }
public int getPageCount() { return pageCount; }

public void accept(DocumentVisitor visitor) {
visitor.visit(this);
}
}

// Конкретный visitor — новая операция без изменения документов
class ExportVisitor implements DocumentVisitor {
public void visit(Invoice invoice) {
System.out.println("Экспорт счёта: " + invoice.getAmount() + " ₽");
}
public void visit(Contract contract) {
System.out.println("Экспорт договора до " + contract.getExpiryDate());
}
public void visit(Report report) {
System.out.println("Экспорт отчёта: " + report.getPageCount() + " стр.");
}
}

// Использование
List<Document> docs = List.of(
new Invoice(new BigDecimal("150000")),
new Contract(LocalDate.of(2027, 1, 1)),
new Report(42)
);

DocumentVisitor exporter = new ExportVisitor();
docs.forEach(doc -> doc.accept(exporter));


▪️ Когда использовать

— Нужно выполнить операцию над группой разнородных объектов
— Новые операции добавляются часто, а новые типы элементов — редко
— Пример из JDK: java.nio.file.FileVisitor

▪️ Минус

Visitor нужно обновлять при добавлении нового типа элемента — нарушается Open/Closed Principle для элементов.

🐸 Библиотека собеса по Java

#patterns
  • 👍 4
  • ❤ 3
  • 🔥 2
More from @javaproglib
  1. Oct 13, 2026🧠 Почему BigDecimal считает 2.0 и 2.00 разными Что выведут эти две строки? var a = new Bi…
  2. Oct 12, 2026👀 Как вы смотрите видео? Разбираете урок, слушаете интервью фоном или начинаете на телефо…
  3. Oct 10, 2026Post #7892
  4. Oct 10, 2026Read. Write. Edit. Bash. Это базовый набор операций Pi — агента, на котором построен OpenC…
  5. Oct 2, 2026🎹 Что делать после ChatGPT? Следующий шаг — AI-агенты. Они не просто отвечают на запросы,…
  6. Sep 30, 2026🔥 Последний день для разработчиков AI уже пишет код. Теперь важнее научиться встраивать е…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →