20
Un visiteur… …venu d’ailleurs Whooooooooooooooo!! !

Un visiteur… …venu dailleurs Whooooooooooooooo!!!

Embed Size (px)

Citation preview

Page 1: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

Un visiteur… …venu d’ailleursWhooooooooooooooo!!!

Page 2: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

Sommaire

• Classification • Intention • Motivation• Utilisation • Constituants• Structure • Collaboration • Conséquence • Considération d’implémentation • Exemple d’implémentation • Mini Projet

Page 3: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

Classification• Comportemental – Objet

• Objet => Relation dynamique par composition• Un élément fait appel à un visiteur

• Comportemental => Collaborations, répartition des responsabilité

Page 4: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

Intention

• Séparer et extraire les traitements appliquées à différents type de nœuds d’une structure

Page 5: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

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

Page 6: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

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

Page 7: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

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

Page 8: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

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

Page 9: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

Structure

Page 10: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

Collaboration

Page 11: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

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

Page 12: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

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.

Page 13: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

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é

Page 14: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

Exemple d’implémentation(1/6)Description

• Eléments :• Chambre à coucher• WC• Cuisine• Salon• …

• Visiteurs :• Ménagère• Peintre• Décorateur• Voleurs

Page 15: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

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

Page 16: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

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);}

Page 17: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

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");    }

}

Page 18: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

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++;

    }

}

Page 19: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

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);    }}

Page 20: Un visiteur… …venu dailleurs Whooooooooooooooo!!!

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