Un visiteur… …venu d’ailleurs Whooooooooooooooo!!! Jonas Berdoz, Marjolaine Steiner, Julien Tissot
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és
Intention Séparer et extraire les traitements appliqués à différents types 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 types de traitements Exemple : Système de fichiers Compilateurs (variables, fonctions, opérateurs, …) Liste de produits
Constituant(1/2) Structure de l’objet Visiteur Élément Représente la structure des éléments liste, Set, Composite - Arbre Visiteur Interface Défini les méthodes de visite pour chaque classe concrète de la structure Élément Interface représentant les éléments constituant la structure de l’objet Défini la méthode abstraite permettant l’appel au visiteur
Constituant(2/2) Visiteur concret Élément concret Implémente les opérations du Visiteur Défini un contexte pour la visite et garde son état local Élé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 Désavantage Facile de rajouter de nouvelles opérations (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êmes 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
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