patron de comportement: visiteur

19
Patron de Comportement: Patron de Comportement: Visiteur F. Mallet [email protected] http://deptinfo.unice.fr/~fmallet/ 2011/2012 F. Mallet 1

Upload: khangminh22

Post on 08-May-2023

1 views

Category:

Documents


0 download

TRANSCRIPT

Patron de Comportement:Patron de Comportement:Visiteur

F. [email protected]

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