patron de comportement: visiteur
TRANSCRIPT
Patron de Comportement:Patron de Comportement:Visiteur
http://deptinfo.unice.fr/~fmallet/
2011/2012 F. Mallet 1
Patrons de comportement : Visiteur
MotivationLes besoins pour une bonne conception et du
bon code :bon code : Extensibilité Flexibilité Flexibilité Facilité à maintenir RéutilisabilitéRéutilisabilité Les qualités internes Meilleure spécification, construction, documentatione eu e spéc ca o , co s uc o , docu e a o
2010/2011 2F. Mallet
Patrons de comportement : Visiteur
HistoriqueMVCGang of Four : Erich Gamma Richard Helm RalphGang of Four : Erich Gamma, Richard Helm,Ralph
Johnson, John Vlissides Définition de 23 patternsp
Design Patterns – Elements of Reusable Object-Oriented Software, Addison Wesley, 1994
Un Design Pattern nomme, abstrait et identifie les aspects essentiels d’une structuration récurrente, ce pqui permet de créer une modélisation orientée objet réutilisable
2010/2011 3F. Mallet
Patrons de comportement : Visiteur
ClassificationCréation Comment un objet peut être créé Comment un objet peut être créé Indépendance entre la manière de créer et la manière
d’utiliserStructure Comment les objets peuvent être combinés
Indépendance entre les objets et les conne ions Indépendance entre les objets et les connexions Comportement Comment les objets communiquentComment les objets communiquent Encapsulation de processus (ex : observer/observable)
2010/2011 4F. Mallet
Patrons de comportement : Visiteur
VisiteurIntention
R é t UNE é ti à ff t l Représenter UNE opération à effectuer sur les éléments d’une structure
Permet de définir une nouvelle opération sansPermet de définir une nouvelle opération sans changer les classes des éléments sur lesquels on opère
Exemple Un arbre de syntaxe abstraite pour un compilateur, un
til XML Diffé t t it t l ê boutil XML…Différents traitement sur le même arbre : type check, optimisation, analyses…
Faire la somme des jours de congés des employés Faire la somme des jours de congés des employés d’une entreprise
Recensement / pretty-print des bébêtes
F. Mallet - Miage M1 5
p y p
Patrons de comportement : Visiteur
Application
Champs d’application Une structure contient beaucoup de classes aux
interfaces différentesP é it l ll ti d l d l t t Pour éviter la pollution des classes de la structure
Les classes définissant la structure changent peu, mais de nouvelles opérations sont toujoursmais de nouvelles opérations sont toujours nécessaires
F. Mallet - Miage M1 6
Patrons de comportement : Visiteur
Sans Visiteur
Exempleinterface Figure {void prettyPrint(String tab); // autant de méthode publiques que de servicesvoid draw(Graphics g); // dépendence sur AWT
}
class Composite implements Figure {Figure[] children;
public void prettyPrint(String tab) {tab += "\t";for(Figure child : children)
child prettyPrint(tab);child.prettyPrint(tab); }public void draw(Graphics g) {
for(Figure child : children)child.draw(g);
}}
F. Mallet - Miage M1 7
Patrons de comportement : Visiteur
Sans Visiteur
Exempleinterface Figure {void prettyPrint(String tab); // autant de méthode publiques que de servicesvoid draw(Graphics g); // dépendence sur AWT
}
class Circle implements Figure {double x, y, r;
public void prettyPrint(String tab) {System.out.println(tab+"Circle:"+this);
}public void draw(Graphics g) {public void draw(Graphics g) {
g.drawEllipse(x, y, r*2, r*2);}
}
F. Mallet - Miage M1 8
Patrons de comportement : Visiteur
Sans Visiteurinterface Figure {void prettyPrint(String tab); // autant de méthode publiques que de servicesoid dra (Graphics g) // dépendence sur AWTvoid draw(Graphics g); // dépendence sur AWT
}
class Rectangle implements Figure {double x y width height;double x, y, width, height;
public void prettyPrint(String tab) {System.out.println(tab+"Rectangle:"+this);
}public void draw(Graphics g) {
g.drawRect(x, y, width, height);}}
}
class Square extends Rectangle {public void prettyPrint(String tab) {public void prettyPrint(String tab) {
System.out.println(tab+"Square:"+this);} // hérite de la méthode draw
}
F. Mallet - Miage M1 9
Patrons de comportement : Visiteur
Figures sans visiteurs
Métier FigureS é ifi l èt
F. Mallet - Miage M1 10
Spécifique classe concrèteService PrettyPrintService draw
Patrons de comportement : Visiteur
Avec Visiteur
Exempleinterface Figure {void accept(FigureVisitor visitor);
}interface FigureVisitor {void visit(Composite c);void visit(Composite c);void visit(Circle c);void visit(Rectangle r);void visit(Square s);
}
class Composite implements Figure, Iterable<Figure> {Figure[] children;Figure[] children;
public void accept(FigureVisitor visitor) {visitor.visit(this);
}}
F. Mallet - Miage M1 11
Patrons de comportement : Visiteur
Avec Visiteur
Exempleinterface Figure {void accept(FigureVisitor visitor);
}
class Circle implements Figure {class Circle implements Figure {double x, y, r;
public void accept(FigureVisitor visitor) {visitor.visit(this);
}}
F. Mallet - Miage M1 12
Patrons de comportement : Visiteur
Avec Visiteur
Exempleinterface Figure {void accept(FigureVisitor visitor);
}
class Rectangle implements Figure {class Rectangle implements Figure {double x, y, width, height;
public void accept(FigureVisitor visitor) {visitor.visit(this);
}}
class Square implements Figure {Square(double x, double y, double length) {
super(x, y, length, length);}public void accept(FigureVisitor visitor) {
visitor.visit(this);}
F. Mallet - Miage M1 13
}}
Patrons de comportement : Visiteur
PrettyPrint
Exempleclass PrettyPrint implements FigureVisitor {y p g {String tab = "";public void visit(Composite c) {
String oldTab = tab;t b + "\t"tab += "\t";for(Figure child : c)
child.accept(this);tab = oldTab;;
}public void visit(Circle c) {
System.out.println(tab + "Circle:" + c);}}public void visit(Rectangle r) {
System.out.println(tab + "Rectangle:" + r);}}public void visit(Square s) {
System.out.println(tab + "Square:" + r);}
}
F. Mallet - Miage M1 14
}
Patrons de comportement : Visiteur
Dessiner dans un Graphics
Exempleclass FigureDrawer implements FigureVisitor {Graphics g;FigureDrawer(Graphics g) { this.g = g; }
public void visit(Composite c) {public void visit(Composite c) {for(Figure child : c)
child.accept(this);}public void visit(Circle c) {
g.drawEllipse(c.x, c.y, c.r*2, c.r*2);}public void visit(Rectangle r) {public void visit(Rectangle r) {
g.drawRect(r.x, r.y, r.width, r.height);}public void visit(Square s) {
this.visit((Rectangle)s);}
}
F. Mallet - Miage M1 15
Patrons de comportement : Visiteur
Figures avec visiteursMétier FigureSpécifique classe concrèteSpécifique classe concrèteService PrettyPrintService draw
F. Mallet - Miage M1 16
Patrons de comportement : Visiteur
ComparaisonMétier FigureSpécifique classe concrète ComparaisonSpécifique classe concrèteService PrettyPrintService draw
Sans Visiteurs Avec Visiteurs
F. Mallet - Miage M1 17
Patrons de comportement : Visiteur
ComparaisonService areaSpécifique classe concrète ComparaisonSpécifique classe concrèteService PrettyPrintService draw
Sans Visiteurs Avec Visiteurs
F. Mallet - Miage M1 18
Patrons de comportement : Visiteur
ConclusionsConséquences
Aj t d ll é ti t è f il Ajout de nouvelles opérations très facile Groupement/séparation des opérations communes Ajout de nouveaux ConcreteElement complexe Ajout de nouveaux ConcreteElement complexe
(opération dépendant du type…) Visitor traverse des structures où les éléments sont
de types complètement différents / Iterator Accumulation d’état dans le visiteur plutôt que dans
d tdes arguments Suppose que l’interface de ConcreteElement est
assez riche pour que le visiteur fasse son travail =>assez riche pour que le visiteur fasse son travail => cela force à montrer l’état interne et à casser l’encapsulation
F. Mallet - Miage M1 19