Outils pour utilisateurs

Outils du site


helloworld:design_pattern:visiteur:java

Visitor pattern Archive du 07/02/2020 le 18/02/2020

Le visiteur version light

Le type de retour de la méthode visit / accept dépend du besoin.

Il peut être plus propre d'utiliser la valeur de retour pour séparer le traitement des données de leur exploitation.

VisitorDemo.java
package cours1;
 
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
 
// Interface contenant les méthodes pour traiter toutes les implémentations de l'interface CarElement.
interface CarElementVisitor {
  String visit(Wheel wheel);
 
  String visit(Engine engine);
 
  String visit(Body body);
 
  String visit(Car car);
}
 
// Interface qui contiendra les données qui seront traitées par la méthode visit.
// Il faut absolument passer par une interface et que la fonction soit implémentée dans le POJO
// pour que la bonne méthode soit appelée en fonction de la signature.
interface CarElement {
  String accept(CarElementVisitor visitor);
}
 
// Une implémentation des données stockées
class Wheel implements CarElement {
  private String name;
 
  public Wheel(String name) {
    this.name = name;
  }
 
  public String getName() {
    return this.name;
  }
 
  public String accept(CarElementVisitor visitor) {
    return visitor.visit(this);
  }
}
 
class Engine implements CarElement {
  public String accept(CarElementVisitor visitor) {
    return visitor.visit(this);
  }
}
 
class Body implements CarElement {
  public String accept(CarElementVisitor visitor) {
    return visitor.visit(this);
  }
}
 
class Car implements CarElement {
  CarElement[] elements;
 
  public Car() {
    this.elements = new CarElement[] { new Wheel("front left"), new Wheel("front right"), new Wheel("back left"),
        new Wheel("back right"), new Body(), new Engine() };
  }
 
  public String accept(CarElementVisitor visitor) {
    List<CarElement> numbers = Arrays.asList(elements);
    return numbers.stream().map(elem -> elem.accept(visitor)).collect(Collectors.joining("\n")) + "\n"
        + visitor.visit(this);
  }
}
 
// Une implémentation du traitement des données
class CarElementPrintVisitor implements CarElementVisitor {
  public String visit(Wheel wheel) {
    return ("Visiting " + wheel.getName() + " wheel");
  }
 
  public String visit(Engine engine) {
    return ("Visiting engine");
  }
 
  public String visit(Body body) {
    return ("Visiting body");
  }
 
  public String visit(Car car) {
    return ("Visiting car");
  }
}
 
class CarElementDoVisitor implements CarElementVisitor {
  public String visit(Wheel wheel) {
    return ("Kicking my " + wheel.getName() + " wheel");
  }
 
  public String visit(Engine engine) {
    return ("Starting my engine");
  }
 
  public String visit(Body body) {
    return ("Moving my body");
  }
 
  public String visit(Car car) {
    return ("Starting my car");
  }
}
 
// Le programme principal
public class VisitorDemo {
  public static void main(String[] args) {
    CarElement car = new Car();
    System.out.println(car.accept(new CarElementPrintVisitor()));
    System.out.println(car.accept(new CarElementDoVisitor()));
  }
}
helloworld/design_pattern/visiteur/java.txt · Dernière modification : 2020/05/11 01:19 de root