Visitor is a behavioral pattern that uses a visitor class which changes the executing algorithm of an element class. By this way, execution algorithm of element can vary as and when a visitor varies. Element object has to accept the visitor object so that object handles the operation on the element object.
In the following example there is a ComputerPart interface defining accept operation along with concrete classes implementing ComputerPart : Keyboard, Mouse, Monitor, Computer. Another interface, ComputerPartVisitor, defines a visitor class operations. Computer uses concrete visitor to do corresponding action. VisitorPatternDemo will use Computer and ComputerPartVisitor classes to demonstrate use of visitor pattern.
Step 1 : Define an interface to represent element
public interface ComputerPart {
default void accept(ComputerPartVisitor computerPartVisitor, ComputerPart computerPart) {
computerPartVisitor.visit(computerPart);
}
}
Step 2 : Create concrete classes implementing the above interface
public class Keyboard implements ComputerPart {}
public class Monitor implements ComputerPart {}
public class Mouse implements ComputerPart {}
public class Computer implements ComputerPart {
ComputerPart [] parts;
public Computer() {
parts = new ComputerPart[] {
new Keyboard(),
new Mouse(),
new Monitor()
};
}
@Override
public void accept(ComputerPartVisitor computerPartVisitor, ComputerPart computerPart) {
for (int i = 0; i < parts.length; i++) {
parts[i].accept(computerPartVisitor, parts[i]);
}
computerPartVisitor.visit(computerPart);
}
}
Step 3 : Define an interface to represent visitor
public interface ComputerPartVisitor {
void visit(ComputerPart computerPart);
}
Step 4 : Create concrete visitor implementing the above interface
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
@Override
public void visit(ComputerPart computerPart) {
if (computerPart instanceof Computer) {
System.out.println("Displaying Computer.");
} else if (computerPart instanceof Keyboard) {
System.out.println("Displaying Keyboard.");
} else if (computerPart instanceof Mouse) {
System.out.println("Displaying Mouse.");
} else if (computerPart instanceof Monitor) {
System.out.println("Displaying Monitor.");
}
}
}
Step 5 : Use ComputerPartDisplayVisitor to display parts of Computer
public class VisitorPatternDemo {
public static void main(String[] args) {
ComputerPart computer = new Computer();
computer.accept(new ComputerPartDisplayVisitor(), computer);
}
}
The output will be :
Displaying Keyboard.
Displaying Mouse.
Displaying Monitor.
Displaying Computer.