В шаблоне Visitor мы используем класс посетителя, который изменяет алгоритм выполнения класса элемента. Таким образом, алгоритм выполнения элемента может меняться как и когда меняется посетитель. Этот шаблон относится к категории шаблонов поведения. Согласно шаблону объект-элемент должен принимать объект-посетитель, чтобы объект-посетитель выполнял операцию над объектом-элементом.
Реализация
Мы собираемся создать интерфейс ComputerPart, определяющий приемную операцию. Клавиатура , мышь , монитор и компьютер — это конкретные классы, реализующие интерфейс ComputerPart . Мы определим другой интерфейс ComputerPartVisitor, который будет определять операции класса посетителя. Компьютер использует конкретного посетителя для выполнения соответствующих действий.
VisitorPatternDemo , наш демонстрационный класс, будет использовать классы Computer и ComputerPartVisitor для демонстрации использования шаблона посетителя.
Шаг 1
Определите интерфейс для представления элемента.
ComputerPart.java
public interface ComputerPart { public void accept(ComputerPartVisitor computerPartVisitor); }
Шаг 2
Создайте конкретные классы, расширяющие вышеуказанный класс.
Keyboard.java
public class Keyboard implements ComputerPart { @Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } }
Monitor.java
public class Monitor implements ComputerPart { @Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } }
Mouse.java
public class Mouse implements ComputerPart { @Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } }
Computer.java
public class Computer implements ComputerPart { ComputerPart[] parts; public Computer(){ parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()}; } @Override public void accept(ComputerPartVisitor computerPartVisitor) { for (int i = 0; i < parts.length; i++) { parts[i].accept(computerPartVisitor); } computerPartVisitor.visit(this); } }
Шаг 3
Определите интерфейс для представления посетителя.
ComputerPartVisitor.java
public interface ComputerPartVisitor { public void visit(Computer computer); public void visit(Mouse mouse); public void visit(Keyboard keyboard); public void visit(Monitor monitor); }
Шаг 4
Создайте конкретного посетителя, реализующего вышеуказанный класс.
ComputerPartDisplayVisitor.java
public class ComputerPartDisplayVisitor implements ComputerPartVisitor { @Override public void visit(Computer computer) { System.out.println("Displaying Computer."); } @Override public void visit(Mouse mouse) { System.out.println("Displaying Mouse."); } @Override public void visit(Keyboard keyboard) { System.out.println("Displaying Keyboard."); } @Override public void visit(Monitor monitor) { System.out.println("Displaying Monitor."); } }
Шаг 5
Используйте ComputerPartDisplayVisitor для отображения частей компьютера .
VisitorPatternDemo.java
public class VisitorPatternDemo { public static void main(String[] args) { ComputerPart computer = new Computer(); computer.accept(new ComputerPartDisplayVisitor()); } }
Шаг 6
Проверьте вывод.