← Back to scenarios
ScenarioCatalog DB

Document visitor

Export or inspect document nodes while keeping those operations outside the document-node classes.

Problem

A document system must support operations such as export and inspection across node types without coupling every new operation to the document-node hierarchy.

Related patterns

Implementations

Visitor

TypeScriptApplication

TypeScript shape operation visitors

Moves rendering and measurement operations into visitors so shape classes remain stable when new operations are introduced.

TypeScript
interface ShapeVisitor<Result> {
  visitCircle(circle: Circle): Result;
  visitRectangle(rectangle: Rectangle): Result;
}

interface Shape {
  accept<Result>(visitor: ShapeVisitor<Result>): Result;
}

class Circle implements Shape {
  constructor(readonly radius: number) {}

  accept<Result>(visitor: ShapeVisitor<Result>) {
    return visitor.visitCircle(this);
  }
}

class Rectangle implements Shape {
  constructor(
    readonly width: number,
    readonly height: number,
  ) {}

  accept<Result>(visitor: ShapeVisitor<Result>) {
    return visitor.visitRectangle(this);
  }
}

class AreaVisitor implements ShapeVisitor<number> {
  visitCircle(circle: Circle) {
    return Math.PI * circle.radius ** 2;
  }

  visitRectangle(rectangle: Rectangle) {
    return rectangle.width * rectangle.height;
  }
}

Associated technologies