Design Pattern Visitor
Open Source Your Knowledge, Become a Contributor
Technology knowledge has to be shared and made accessible for free. Join the movement.
Première étape
On définit une interface qui représente un élément.
CarElement.java
interface CarElement {
void accept(CarElementVisitor visitor);
// Méthode à définir par les classes implémentant CarElements
}
Deuxième étape
On crée les classes qui étendent de cette interface.
Wheel.java
class Wheel implements CarElement {
private String name;
Wheel(String name) {
this.name = name;
}
String getName() {
return this.name;
}
public void accept(CarElementVisitor visitor) {
visitor.visit(this);
}
}
Engine.java
class Engine implements CarElement {
public void accept(CarElementVisitor visitor) {
visitor.visit(this);
}
}
Body.java
class Body implements CarElement {
public void accept(CarElementVisitor visitor) {
visitor.visit(this);
}
}
Car.java
class Car {
CarElement[] elements;
public CarElement[] getElements() {
return elements.clone(); // Retourne une copie du tableau de références
}
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()
};
}
}
Troisième étape
On crée une interface qui représente Visitor.
CarElementVisitor.java
interface CarElementVisitor {
void visit(Wheel wheel);
void visit(Engine engine);
void visit(Body body);
void visitCar(Car car);
}
Quatrième étape
On crée deux classes visitor qui étendent l'interface précédente.
CarElementPrintVisitor.java
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 visitCar(Car car) {
System.out.println("\nVisiting car");
for(CarElement element : car.getElements()) {
element.accept(this);
}
System.out.println("Visited car");
}
}
CarElementDoVisitor.java
class CarElementDoVisitor implements CarElementVisitor {
public void visit(Wheel wheel) {
System.out.println("Kicking my "+ wheel.getName());
}
public void visit(Engine engine) {
System.out.println("Starting my engine");
}
public void visit(Body body) {
System.out.println("Moving my body");
}
public void visitCar(Car car) {
System.out.println("\nStarting my car");
for(CarElement carElement : car.getElements()) {
carElement.accept(this);
}
System.out.println("Started car");
}
}
Cinquième étape
On crée une classe de test pour la démonstration grâce aux deux classes précédentes.
TestVisitorDemo.java
public class TestVisitorDemo {
static public void main(String[] args) {
Car car = new Car();
CarElementVisitor printVisitor = new CarElementPrintVisitor();
CarElementVisitor doVisitor = new CarElementDoVisitor();
printVisitor.visitCar(car);
doVisitor.visitCar(car);
}
}
Voilà à quoi ressemble le diagramme de classe de notre exemple :
Sixième étape
On vérifie que tout cela fonctionne.
1
6
7
24
25
32
33
40
41
61
// Interface CarElement {
// Classe Wheel {
// Classe Engine {
// Classe Body {
// Classe Body {
Enter to Rename, Shift+Enter to Preview
Quiz
Combien y a t-il d'étapes dans notre tutoriel ?
Combien d'interfaces avons-nous défini ?
Chaque classe pouvant être "visitée" doit mettre à disposition une méthode publique :
Quelle est la première étape ?
Merci d'avoir suivi ce playground !
Open Source Your Knowledge: become a Contributor and help others learn. Create New Content