Un visiteur… …venu d’ailleurs Whooooooooooooooo!! !
Un visiteur… …venu d’ailleursWhooooooooooooooo!!!
Sommaire
• Classification • Intention • Motivation• Utilisation • Constituants• Structure • Collaboration • Conséquence • Considération d’implémentation • Exemple d’implémentation • Mini Projet
Classification• Comportemental – Objet
• Objet => Relation dynamique par composition• Un élément fait appel à un visiteur
• Comportemental => Collaborations, répartition des responsabilité
Intention
• Séparer et extraire les traitements appliquées à différents type de nœuds d’une structure
Motivation• Les actions divergent selon le type d’élément
de la structure• Permet l’ajout de nouveaux types d’actions sur
les objets de la structure sans les modifier• Exemple : Compilateur
• Parcours de l’arbre syntaxique• Traitement différent selon l’opérateur
Utilisation• Structure dont le nombre de types d’éléments
est peut variable• Structure sur laquelle on peut envisager
d’appliquer plusieurs type de traitements• Exemple :
• Système de fichiers• Compilateurs (variables, fonctions, opérateurs, …)• Liste de produits
Constituant(1/2)• Structure de l’objet
• Représente la structure des éléments• liste, Set, Composite - Arbre
• Visiteur• Interface• Définit les méthode de visite pour chaque classe concrète de la
structure• Elément
• Interface représentant les éléments constituant la structure de l’objet
• Définit la méthode abstraite permettant l’appel au visiteur
Constituant(2/2)• Visiteur concret
• Implémente les opérations du Visiteur• Définit un contexte pour la visite et garde son état
local • Elément concret
• Implémente la méthode d’appel au visiteur• Se passe en paramètre à la bonne méthode du
visiteur
Structure
Collaboration
Conséquence• Avantages
– Facile de rajouter de nouvelles opération (visiteur)– Le visiteur peut garder des états des éléments. On ne doit ainsi pas
les passer en argument.– Les algorithmes de traitement d’un élément ne sont pas dans sa
classe => meilleure séparation• Désavantage
– Difficile de rajouter de nouveaux éléments => il faut changer chaque visiteur => violation OCP
– L’encapsulation est limitée car il faut laisser les méthodes d’accès en public dans l’élément
Considération d’implémentation(1/2)
• Chaque élément concret a une méthode associée dans le visiteur.
• Rigueur dans la nomenclature, confusion• Une classe par nœuds, lourd si les nœuds ont les
même propriétés. • Déclaration des accesseurs obligatoires(attribut
public) pour les nœuds, afin d’accéder au contexte du nœud depuis le visiteur.
Considération d’implémentation(2/2)• Double dispatch
• Surcharge de la méthode accept avec le visiteur• Surcharge de la méthode visit avec le type nœud
• Qui traverse la structure• La structure de l’objet
• Collection, Composite
• Le visiteur• Parcours dupliqué par visiteur• Parcours complexe
• Itérateur séparé
Exemple d’implémentation(1/6)Description
• Eléments :• Chambre à coucher• WC• Cuisine• Salon• …
• Visiteurs :• Ménagère• Peintre• Décorateur• Voleurs
Exemple d’implémentation(2/6)Schéma UML
class Class Mo...
Toilettes
+ accept(Visiteur) : voidTerrasse
+ accept(Visiteur) : voidSallon
+ accept(Visiteur) : voidSalleDeBain
+ accept(Visiteur) : void
Piece
+ accept(Visiteur) : void+ getName() : String+ getSize() : Dimension+ setSize(Dimension) : void
ChambreACoucher
+ accept(Visiteur) : voidBureau
+ accept(Visiteur) : void
Menagere
+ visit(Bureau) : void+ visit(ChambreACoucher) : void+ visit(SalleDeBain) : void+ visit(Sallon) : void+ visit(Terrasse) : void+ visit(Toilettes) : void
«interface»Visiteur
+ visit(Bureau) : void+ visit(ChambreACoucher) : void+ visit(SalleDeBain) : void+ visit(Sallon) : void+ visit(Terrasse) : void+ visit(Toilettes) : void
Voleur
+ getNbObjetsVoles() : int+ visit(Bureau) : void+ visit(ChambreACoucher) : void+ visit(SalleDeBain) : void+ visit(Sallon) : void+ visit(Terrasse) : void+ visit(Toilettes) : void
Maison
1
Exemple d’implémentation(3/6)Visiteur
public interface Visiteur { void visit(Bureau p); void visit(ChambreACoucher p); void visit(SalleDeBain p); void visit(Sallon p); void visit(Terrasse p); void visit(Toilettes p);}
Exemple d’implémentation(4/6)Ménagère
public class Menagere implements Visiteur {
@Override public void visit(Bureau p) { System.out.println("Nettoie bureau"); }
@Override public void visit(Toilettes p) { System.out.println("Nettoie les toilettes"); }
}
Exemple d’implémentation(5/6)Voleur
public class Voleur implements Visiteur { private int nbObjetsVoles; public int getNbObjetsVoles() { return nbObjetsVoles; }
@Override public void visit(Bureau p) { System.out.printf("%20s --> %s\n", p.getClass().getSimpleName()," Vol l'ordinateur"); nbObjetsVoles++; }
@Override public void visit(Toilettes p) { System.out.printf("%20s --> %s\n", p.getClass().getSimpleName()," Vol la brosse"); nbObjetsVoles++;
}
}
Exemple d’implémentation(6/6)Principal
public static void main(String[] args) { int nbPieces = 10; List<Piece> pieces = new LinkedList<Piece>(); Visiteur visiteur = new Menagere(); String[] typePieces ={"Bureau", "ChambreACoucher", "SalleDeBain", "Sallon", "Terrasse", "Toilettes"}; // Generation d'une maison aléatoire for (int i = 0; i < nbPieces; i++) { pieces.add(newPieceAleatoire(typePieces)); } // Afficher la structure de la maison System.out.println("Pieces : "); for (Piece p : pieces) { System.out.println(" - " + p.getName()); } System.out.println(); // Action sur la maison for (Piece p : pieces) { p.accept(visiteur); }}
Mini Projet• Programme de gestion d’un système de fichier
• Les éléments:• Dossiers• Liens• Fichiers
• Les visiteurs:• Statistique d’un dossier• Copie des fichiers respectant une expression régulière