helloworld:design_pattern:visiteur:java
Ceci est une ancienne révision du document !
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.1497440458.txt.gz · Dernière modification : de root