Visitor

Visiteur (d'objet).

Besoin

Définir une nouvelle opération sur des objets sans changer leur code.

Analyse

Alors que le polyphormisme permet de faire varier le comportement d'objets d'une même hiérarchie, le DP visiteur permet d'appliquer la même variation à des comportements externes, appliqués à des objets. De plus, il ne nécessite pas que les objets appartiennent à une même hiérarchie.

L'idée du visiteur est d'implémenter dans un objet annexe (le visiteur), qui invoquera de l'extérieur (viendra visiter) les opérations à exécuter pour ce comportement. L'objet visité n'aura eu aucune dépendance avec le visiteur concret.

Le DP visiteur définit :

Exemple

interface MyVisitor {<br> void <strong>visit</strong> (Car visitedCar);<br> void <strong>visit</strong> (Computer visitedComputer);<br> } <br> <br> interface MyVisitable {<br> void <strong>accept</strong> (MyVisitor visitor);<br> } <br> <br> class StopVisitor implements MyVisitor {<br> <span class="codeComment"> /**<br> * The stop operation performed on a Car <br> */<br> </span> public void <strong>visit </strong>(Car visitedCar) {<br> visitedCar.freine(on);<br> visitedCar.debraye(true);<br> visitedCar.vitesse(0);<br> visitedCar.debraye(false);<br> visitedCar.setContact(false);<br> }<br> <br> <span class="codeComment"> /**<br> * The stop operation performed on a Computer<br> */<br> </span> public void <strong>visit </strong>(Computer visitedComputer) {<br> visitedComputer.cliqueDemarrer();<br> visitedComputer.selectionne("Arrêter l'ordinateur");<br> }<br> } <br> <br> class Car implements MyVisitable {<br> <br> public void freine(boolean on) {<br> <span class="codeComment">// Code ici... </span><br> } <br> <br> public void debraye(boolean on) {<br> <span class="codeComment">// Code ici... </span><br> } <br> <br> public void vitesse(int level) {<br> <span class="codeComment">// Code ici... </span><br> } <br> <br> public void setContact(boolean on) {<br> <span class="codeComment">// Code ici... </span><br> } <br> <br> public void <strong>accept</strong> (MyVisitor visitor) {<br> visitor.<strong>visit </strong>(this); <span class="codeComment">// Ask the visitor to perform its operation on myself</span><br> }<br> }<br> <br> class Computer implements MyVisitable {<br> <br> public void cliqueDemarrer() {<br> <span class="codeComment">// Code ici... </span><br> } <br> <br> public void selectionne(String menuChoice) {<br> <span class="codeComment">// Code ici... </span><br> } <br> <br> public void <strong>accept</strong> (MyVisitor visitor) {<br> visitor.<strong>visit </strong>(this); <span class="codeComment">// Ask the visitor to perform its operation on myself</span><br> }<br> }<br> <br> class Main {<br> public static void main (String args[]) {<br> MyVisitor stopVisitor = new MyStopVisitor(); <span class="codeComment">// Une implementation de visiteur qui stoppe les objects</span><br> <br> MyVisitable car = new Car();<br> car.<strong>accept </strong>(stopVisitor); <br> <br> MyVisitable computer = new Computer();<br> computer.<strong>accept </strong>(stopVisitor); <br> }<br> }

Notes