Outils pour utilisateurs

Outils du site


helloworld:design_pattern:visiteur:java

Ceci est une ancienne révision du document !


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

Le visiteur version light

VisitorDemo.java
// Interface contenant les méthodes pour traiter toutes les implémentations de l'interface CarElement.
interface CarElementVisitor {
  void visit(Wheel wheel);
  void visit(Engine engine);
  void visit(Body body);
  void 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 {
  void 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 void accept(CarElementVisitor visitor) {
    visitor.visit(this);
  }
}
 
class Engine implements CarElement {
  public void accept(CarElementVisitor visitor) {
    visitor.visit(this);
  }
}
 
class Body implements CarElement {
  public void accept(CarElementVisitor visitor) {
    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 void accept(CarElementVisitor visitor) {  
    for(CarElement elem : elements) {
      elem.accept(visitor);
    }
    visitor.visit(this);
  }
}
 
// Une implémentation du traitement des données
class CarElementPrintVisitor implements CarElementVisitor {
  public void visit(Wheel wheel) {    
    System.out.println("Visiting " + wheel.getName() + " wheel");
  }
 
  public void visit(Engine engine) {
    System.out.println("Visiting engine");
  }
 
  public void visit(Body body) {
    System.out.println("Visiting body");
  }
 
  public void visit(Car car) {    
    System.out.println("Visiting car");
  }
}
 
class CarElementDoVisitor implements CarElementVisitor {
  public void visit(Wheel wheel) {
    System.out.println("Kicking my " + wheel.getName() + " wheel");
  }
 
  public void visit(Engine engine) {
    System.out.println("Starting my engine");
  }
 
  public void visit(Body body) {
    System.out.println("Moving my body");
  }
 
  public void visit(Car car) {
    System.out.println("Starting my car");
  }
}
 
// Le programme principal
public class VisitorDemo {
  public static void main(String[] args) {
    CarElement car = new Car();
    car.accept(new CarElementPrintVisitor());
    car.accept(new CarElementDoVisitor());
  }
}

Le visiteur avec des paramètres et un code de retour

Ajouter un paramètre et un code de retour ne nécessite que de modifier l'interface CarElementVisitor et CarElement. Le reste du code devra être modifié en conséquence pour permettre sa compilation.

VisitorDemo.java
// Interface contenant les méthodes pour traiter toutes les implémentations de l'interface CarElement.
interface CarElementVisitor {
  Object visit(Wheel wheel, Object data);
  Object visit(Engine engine, Object data);
  Object visit(Body body, Object data);
  Object visit(Car car, Object data);
}
 
// 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 {
  Object accept(CarElementVisitor visitor, Object data);
}
 
// 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 Object accept(CarElementVisitor visitor, Object data) {
    return visitor.visit(this, data);
  }
}
 
class Engine implements CarElement {
  public Object accept(CarElementVisitor visitor, Object data) {
    return visitor.visit(this, data);
  }
}
 
class Body implements CarElement {
  public Object accept(CarElementVisitor visitor, Object data) {
    return visitor.visit(this, data);
  }
}
 
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 Object accept(CarElementVisitor visitor, Object data) {  
    for(CarElement elem : elements) {
      // Traiter correctement le code retour si nécessaire ici.
      elem.accept(visitor, data);
    }
    return visitor.visit(this, data);
  }
}
 
// Une implémentation du traitement des données
class CarElementPrintVisitor implements CarElementVisitor {
  public Object visit(Wheel wheel, Object data) {    
    System.out.println("Visiting " + wheel.getName() + " wheel");
    return null;
  }
 
  public Object visit(Engine engine, Object data) {
    System.out.println("Visiting engine");
    return null;
  }
 
  public Object visit(Body body, Object data) {
    System.out.println("Visiting body");
    return null;
  }
 
  public Object visit(Car car, Object data) {    
    System.out.println("Visiting car");
    return null;
  }
}
 
class CarElementDoVisitor implements CarElementVisitor {
  public Object visit(Wheel wheel, Object data) {
    System.out.println("Kicking my " + wheel.getName() + " wheel");
    return null;
  }
 
  public Object visit(Engine engine, Object data) {
    System.out.println("Starting my engine");
    return null;
  }
 
  public Object visit(Body body, Object data) {
    System.out.println("Moving my body");
    return null;
  }
 
  public Object visit(Car car, Object data) {
    System.out.println("Starting my car");
    return null;
  }
}
 
// Le programme principal
public class VisitorDemo {
  public static void main(String[] args) {
    CarElement car = new Car();
    // Traiter correctement le code retour si nécessaire.
    car.accept(new CarElementPrintVisitor(), null);
    car.accept(new CarElementDoVisitor(), null);
  }
}
helloworld/design_pattern/visiteur/java.1582047634.txt.gz · Dernière modification : de root