Design Pattern Visitor

VincentLagardeAmelieMeyzie
29.5K views

Open Source Your Knowledge, Become a Contributor

Technology knowledge has to be shared and made accessible for free. Join the movement.

Create Content
Previous: Design Pattern Visiteur

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 :

Diagramme de classe de l'exemple Visiteur

Sixième étape

On vérifie que tout cela fonctionne.

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 !
Plus d'infos/Références
Open Source Your Knowledge: become a Contributor and help others learn. Create New Content