[[https://en.wikipedia.org/w/index.php?title=Visitor_pattern|Visitor pattern]] {{ :helloworld:design_pattern:visiteur:java:visitor_pattern_-_wikipedia_2020-02-18_18_38_39_.html |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. 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 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())); } }