← Back to scenarios
ScenarioCatalog DB

Cart visitor

Calculate pricing and discounts across cart item types without coupling pricing behavior to products.

Problem

A shopping cart must apply pricing and discount calculations across different product types while allowing new calculations to be introduced without modifying each item class.

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