Skip to main content

Visitor

Overview

Add operations to object structures without changing their classes.

When to use

  • You need to run multiple operations on a stable object structure.
  • Adding new operations is more common than adding new node types.

Java example

interface Visitor {
void visit(TextNode node);
void visit(ImageNode node);
}

interface Node {
void accept(Visitor v);
}

class TextNode implements Node {
public void accept(Visitor v) { v.visit(this); }
}

TypeScript example

interface Visitor {
visitText(node: TextNode): void;
visitImage(node: ImageNode): void;
}

interface Node {
accept(v: Visitor): void;
}

class TextNode implements Node {
accept(v: Visitor): void { v.visitText(this); }
}

Pros and cons

Pros:

  • New operations can be added without modifying nodes.
  • Separates algorithms from object structure.

Cons:

  • Adding new node types requires updating all visitors.
  • Can be verbose.

Common pitfalls

  • Using Visitor for small object graphs.
  • Forgetting to update all visitors after new nodes.