Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.
This page is a work in progress
We roll out the updates weekly. Leave your email to track the progress. You can expect one email per month and no spam, pinky promise.
Structure of design pattern
// A complex hierarchy of components. interface Graphic is method move(x, y) method draw() method accept(v: Visitor) class Shape implements Graphic is field id // It is crucial to implement the accept() method in every single component, // not just a base class. It helps the program to pick a proper method on // the visitor class in case if a given component's type is unknow. method accept(v: Visitor) is v.visitDot(this); class Dot extends Shape is field x, y // ... method accept(v: Visitor) is v.visitDot(this); class Circle extends Dot is field radius // ... method accept(v: Visitor) is v.visitCircle(this); class Rectangle extends Shape is field width, height // ... method accept(v: Visitor) is v.visitRectangle(this); class CompoundGraphic implements Graphic is field children: array of Graphic // ... method accept(v: Visitor) is v.visitCompoundGraphic(this); // Visitor interface must have visiting methods for the every single component. // Note that each time you add a new class to the component history, you will // need to add a method to the visitor classes. In this case, you might consider // avoiding visitor altogether. interface Visitor is method visitDot(d: Dot) method visitCircle(c: Circle) method visitRectangle(r: Rectangle) method visitCompoundGraphic(cs: CompoundGraphic) // Concrete visitor adds a single operation to the entire hierarchy of // components. Which means that if you need to add multiple operations, you will // have to create several visitor. class XMLExportVisitor is method visitDot(d: Dot) is Export dot's id and center coordinates. method visitCircle(c: Circle) is Export circle's id, center coordinates and radius. method visitRectangle(r: Rectangle) is Export rectangle's id, left-top coordinates, width and height. method visitCompoundGraphic(cg: CompoundGraphic) is Export shape's id and the list of children ids. // Application can use visitor along with any set of components without checking // their type first. Double dispatch mechanism guarantees that a proper visiting // method will be called for any given component. class Application is field allGraphics: array of Graphic method export() is exportVisitor = new XMLExportVisitor() foreach (allGraphics as graphic) graphics.accept(exportVisitor)
Implementations in Different Programming Languages
- Read why Visitors can't be simply replaced with method overloading in our article Visitor and Double Dispatch.