Visitor Pattern Tutorial
This tutorial is aimed to guide the definition and application of Gang of Four (GoF) visitor design pattern. By reading this tutorial, you will know how to develop a model for the visitor pattern, and how to apply it in practice.
Modeling a Design Pattern with a Class Diagram
- Create a new project named Design Patterns.
- Create a class diagram named Visitor.

- Select Class from the diagram toolbar. Click on the diagram to create a class and name it Client.

- Move the mouse cursor over the Client class and drag out Association > Class to create an associated class named Visitor.

- Right-click on Visitor and select Model Element Properties > Abstract to set it as abstract.

- Right-click on the Visitor class and select Add > Operation from the popup menu.

- Name the operation `VisitConcreteElement(ConcreteElement)`.
- Right-click on `VisitConcreteElement()` and select Model Element Properties > Abstract to set it as abstract.

- Move the mouse cursor over the Visitor class and drag out Generalization > Class to create a subclass named ConcreteVisitor.

- We need to make the concrete visitors inherit operations from the visitor class. Right-click on ConcreteVisitor and select Related Elements > Realize all Interfaces from the popup menu.

- Move the mouse cursor over the Client class and drag out Association > Class to create an associated class named ObjectStructure.

- Move the mouse cursor over the ObjectStructure class and drag out Association > Class to create an associated class named Element.

- Right-click on Element and select Model Element Properties > Abstract to set it as abstract.
- Right-click on the Element class, select Add > Operation from the popup menu, and name the operation `Accept(Visitor)`.
- Right-click on `Accept(Visitor)` and select Model Element Properties > Abstract to set it as abstract. At this point, the diagram becomes:

- Move the mouse cursor over the Element class and drag out Generalization > Class to create a subclass named ConcreteElement.

- We need to make the concrete elements inherit operations from the element class. Right-click on ConcreteElement and select Related Elements > Realize all Interfaces from the popup menu.

- In practice, there may be multiple `ConcreteVisitor` classes. To represent this, stereotype the `ConcreteVisitor` class as PTN Cloneable. Right-click on the `ConcreteVisitor` class and select Stereotypes > Stereotypes... from the popup menu.

- In the Stereotypes tab of the class specification, select PTN Cloneable and click > to assign it to the class. Click OK to confirm.

- Repeat the stereotyping process on the `ConcreteElement` class.

- There may be multiple operations in `Visitor`, `Element`, and `ConcreteElement`. To represent this, stereotype them as PTN Members Creatable by following the same stereotyping steps as before. At this point, the pattern should look like this:

Defining the Pattern
- Select all classes on the class diagram.

- Right-click on the selection and select Define Design Pattern... from the popup menu.

- In the Define Design Pattern dialog box, specify the pattern name as Visitor. Keep the file name as is. Click OK to proceed.

Applying a Design Pattern to a Class Diagram
In this section, we will use the visitor pattern to model visiting elements in a room.
- Create a new project named My Room.
- Create a class diagram named Domain Model.
- Right-click on the class diagram and select Utilities > Apply Design Pattern... from the popup menu.

- In the Design Pattern dialog box, select Visitor from the list of patterns.

- Click on ObjectStructure in the overview.

- Rename it to RoomElements in the bottom pane.

- Select Element in the overview. In the bottom pane, rename it to RoomElement. Rename the parameter Visitor in `Accept()` to RoomElementVisitor.

- Select ConcreteElement in the overview. In the bottom pane, rename it to Chair. Rename the parameter Visitor in `Accept()` to RoomElementVisitor.

- We need two more concrete elements for a bed and a table. Keep `ConcreteElement` selected, click the + button, and select Clone... from the popup menu.

- Enter `2` as the number of classes to clone. Click OK to confirm.

- In the bottom pane, rename ConcreteElement2 and ConcreteElement3 to Bed and Table. For each, rename the parameter Visitor to RoomElementVisitor.

- Select Visitor in the overview. In the bottom pane, rename it to RoomElementVisitor. Rename the operation VisitConcreteElement to VisitChair, and its parameter ConcreteElement to Chair.

- We need two more operations for visiting the bed and table. Keep Visitor selected, click the + button, and select New Operation... from the popup menu.

- In the Operation Specification dialog box, name the operation `VisitBed`.

- Open the Parameters tab.

- Click Add... at the bottom, and create a parameter named `Bed` of type `Bed` in the Parameter Specification dialog box. Click OK to go back to the Operation Specification dialog box.

- In the General page, check Abstract.

- Click OK to confirm editing.
- Repeat the previous steps to create one more abstract operation, `VisitTable`, which has a `Table` parameter.

- Select ConcreteVisitor in the overview. In the bottom pane, rename it to RoomElementPaintVisitor. Rename the operation VisitConcreteElement to VisitChair, and its parameter ConcreteElement to Chair.

- We need one more visitor for printing elements' information. Keep `ConcreteVisitor` selected, click the + button, and select Clone... from the popup menu.

- Enter `1` as the number of classes to clone. Click OK to confirm.

- In the bottom pane, rename ConcreteVisitor2 to RoomElementInfoVisitor. Rename the operation VisitConcreteElement to VisitChair, and its parameter ConcreteElement to Chair.

- Click OK to confirm editing and apply the pattern to the diagram.
- Tidy up the diagram. It should become:
