Un visiteur… …venu dailleurs Whooooooooooooooo!!!

Preview:

Citation preview

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