Wzorce projektowe - wzorzec dla odwiedzających

We wzorcu Visitor używamy klasy visitor, która zmienia algorytm wykonywania klasy elementów. W ten sposób algorytm wykonania elementu może się różnić w zależności od zmiany odwiedzającego. Ten wzorzec należy do kategorii wzorców zachowania. Zgodnie ze wzorcem obiekt element musi zaakceptować obiekt gościa, aby obiekt odwiedzający obsługiwał operację na obiekcie elementu.

Realizacja

Zamierzamy stworzyć interfejs ComputerPart definiujący akceptację operacji. Keyboard , Mouse , Monitor i Computer to konkretne klasy implementujące interfejs ComputerPart . Zdefiniujemy inny interfejs ComputerPartVisitor, który zdefiniuje operacje klasy gościa. Komputer używa konkretnego gościa do wykonania odpowiedniej czynności.

VisitorPatternDemo , nasza klasa demonstracyjna, użyje klas Computer i ComputerPartVisitor do zademonstrowania użycia wzorca gościa.

Krok 1

Zdefiniuj interfejs do reprezentowania elementu.

ComputerPart.java

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

Krok 2

Utwórz konkretne klasy rozszerzające powyższą klasę.

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

Krok 3

Zdefiniuj interfejs reprezentujący gościa.

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

Krok 4

Utwórz konkretnego gościa implementującego powyższą klasę.

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

Krok 5

Użyj ComputerPartDisplayVisitor, aby wyświetlić części Computer .

VisitorPatternDemo.java

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

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

Krok 6

Sprawdź dane wyjściowe.

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