90 likes | 261 Views
Intention. Séparer et extraire les traitements appliquées à différents type de nœuds d’une structure. Motivations. Permet l’ajout de nouveaux types d’actions sur les objets de la structure sans les modifier Exemple : Système de fichier Renommage massif
E N D
Intention • Séparer et extraire les traitements appliquées à différents type de nœuds d’une structure
Motivations • Permet l’ajout de nouveaux types d’actions sur les objets de la structure sans les modifier • Exemple : Système de fichier • Renommage massif • Extraction selon type (*.png,*.jpg,… -> Images)
Utilisation • Structure contenant un nombre de différent types de nœud fixe • 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
Exemple d’implémentation • Eléments : • Chambre à coucher • WC • Cuisine • Salon • … • Visiteurs : • Ménagère • Peintre • Décorateur • Voleurs
Interface visiteur publicinterface Visiteur { voidvisit(Bureau p); voidvisit(ChambreACoucher p); voidvisit(SalleDeBain p); voidvisit(Sallon p); voidvisit(Terrasse p); voidvisit(Toilettes p); }
Menagère publicclassMenagereimplements Visiteur { @Overridepublicvoidvisit(Bureau p){System.out.println("Nettoie bureau");} @Overridepublicvoidvisit(Toilettes p){System.out.println("Nettoie les toilettes");}}
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++;}}
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);}}