200 likes | 314 Views
Un visiteur… …venu d’ailleurs. Whooooooooooooooo !!!. Sommaire. Classification Intention Motivation Utilisation Constituants Structure Collaboration Conséquence Considération d’implémentation Exemple d’implémentation Mini Projet. Classification. Comportemental – Objet
E N D
Un visiteur… …venu d’ailleurs Whooooooooooooooo!!!
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 • Permet l’ajout de nouveaux types d’actions sur les objets de la structure sans les modifier • Les actions divergent selon le type d’élément de la structure • 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
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(3/6)Visiteur publicinterface Visiteur { voidvisit(Bureau p); voidvisit(ChambreACoucher p); voidvisit(SalleDeBain p); voidvisit(Sallon p); voidvisit(Terrasse p); voidvisit(Toilettes p); }
Exemple d’implémentation(4/6)Ménagère publicclassMenagereimplements Visiteur { @Overridepublicvoidvisit(Bureau p){System.out.println("Nettoie bureau");} @Overridepublicvoidvisit(Toilettes p){System.out.println("Nettoie les toilettes");}}
Exemple d’implémentation(5/6)Voleur publicclass Voleur implements Visiteur {privateintnbObjetsVoles;publicintgetNbObjetsVoles(){returnnbObjetsVoles;} @Overridepublicvoidvisit(Bureau p){System.out.printf("%20s --> %s\n", p.getClass().getSimpleName()," Vol l'ordinateur");nbObjetsVoles++;} @Overridepublicvoidvisit(Toilettes p){System.out.printf("%20s --> %s\n", p.getClass().getSimpleName()," Vol la brosse");nbObjetsVoles++;}}
Exemple d’implémentation(6/6)Principal publicstaticvoid main(String[]args){intnbPieces=10; List<Piece>pieces=newLinkedList<Piece>(); Visiteur visiteur=newMenagere();String[]typePieces={"Bureau", "ChambreACoucher", "SalleDeBain","Sallon","Terrasse","Toilettes"};// Generation d'une maison aléatoirefor(int i =0; i <nbPieces; i++){pieces.add(newPieceAleatoire(typePieces));}// Afficher la structure de la maisonSystem.out.println("Pieces : ");for(Piece p :pieces){System.out.println(" - "+p.getName());}System.out.println();// Action sur la maisonfor(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