Design Patterns - Visitor Pattern

Nel pattern Visitor, usiamo una classe Visitor che cambia l'algoritmo di esecuzione di una classe element. In questo modo, l'algoritmo di esecuzione dell'elemento può variare al variare del visitatore. Questo modello rientra nella categoria del modello di comportamento. Secondo il modello, l'oggetto elemento deve accettare l'oggetto visitatore in modo che l'oggetto visitatore gestisca l'operazione sull'oggetto elemento.

Implementazione

Creeremo un'interfaccia ComputerPart che definisca l'operazione di accettazione. Tastiera , mouse , monitor e computer sono classi concrete che implementano l' interfaccia ComputerPart . Definiremo un'altra interfaccia ComputerPartVisitor che definirà le operazioni di una classe visitatore. Il computer utilizza un visitatore concreto per eseguire l'azione corrispondente.

VisitorPatternDemo , la nostra classe demo, utilizzerà le classi Computer e ComputerPartVisitor per dimostrare l'uso del pattern del visitatore.

Passo 1

Definisci un'interfaccia per rappresentare l'elemento.

ComputerPart.java

public interface ComputerPart {
   public void accept(ComputerPartVisitor computerPartVisitor);
}

Passo 2

Crea classi concrete che estendono la classe precedente.

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);
   }
}

Passaggio 3

Definisci un'interfaccia per rappresentare il visitatore.

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);
}

Passaggio 4

Crea un visitatore concreto implementando la classe sopra.

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.");
   }
}

Passaggio 5

Utilizzare ComputerPartDisplayVisitor per visualizzare parti di Computer .

VisitorPatternDemo.java

public class VisitorPatternDemo {
   public static void main(String[] args) {

      ComputerPart computer = new Computer();
      computer.accept(new ComputerPartDisplayVisitor());
   }
}

Passaggio 6

Verifica l'output.

Displaying Mouse.
Displaying Keyboard.
Displaying Monitor.
Displaying Computer.