18
2011/2012 F. Mallet 1 Patrons de conception: Décorateurs, écouteurs F. Mallet [email protected] http://deptinfo.unice.fr/~fmallet/java/gse.html

Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Embed Size (px)

Citation preview

Page 1: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

2011/2012 F. Mallet 1

Patrons de conception:Décorateurs, écouteurs

F. [email protected]

http://deptinfo.unice.fr/~fmallet/java/gse.html

Page 2: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

2011/2012 F. Mallet 2

Chapitre VI – ObjectifsPatrons de conceptions Décorateur Ecouteur

Page 3: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

F. Mallet 3

Décorateur / DecoratorIntention Attacher dynamiquement des capacités additionnelles

à un objet Fournir ainsi une alternative flexible à l’héritage pour

étendre les fonctionnalitésExemple Ajout de capacités pour objet individuellement et

dynamiquement Englober l’objet existant dans un autre objet qui

ajoute les capacités (plus que d’hériter) ex : JScrollPane

Synonyme : Wrapper (attention !)2011/2012

Page 4: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

Décorateur: example1Décorateur : Compteur Ajout de propriétés sans perturber l’utilisateur

2011/2012 F. Mallet 4

Page 5: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

Décorateur: example2Décorateur : Temperature Ajout de propriétés sans perturber l’utilisateur

2011/2012 F. Mallet 5

Consistance ?Kelvin ? Centigrade ? Rankine ? Réaumur ?

Delisle ? Newton ?

Centigrade ?

Page 6: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

Décorateur: example2Décorateur : Temperature Ajout de propriétés sans perturber l’utilisateur

2011/2012 F. Mallet 6

Celsius ?Fahrenheit ?

Celsius ?Fahrenheit ?

Page 7: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

Décorateur: example2Décorateur : Temperature Ajout de propriétés sans perturber l’utilisateur

2011/2012 F. Mallet 7

Page 8: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

En Java

Temperatureclass Temperature

implements ITemperature {

private double valeur;

Temperature(double v) {

this.valeur = v;

}

public double get() {

return valeur;

}

public void set(double v) {

this.valeur = v;

}

}

CelsiusVersFahrenheitclass CelsiusVersFahrenheit

implements ITemperature {

private ITemperature celsius;

CelsiusVersFahrenheit(ITemperature c){

this.celsius = c;

}

public double get() {

return celsius.get()*9/5+32;

}

public void set(double fahr) {

celsius.set((fahr-32)*9/5);

}

}

2011/2012 F. Mallet 8

Page 9: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

F. Mallet 9

RésuméImplémentation Java : utilisation d’interfaces pour la conformité Pas forcément besoin d’un décorateur abstrait Maintenir une classe de base légère Decorator est fait pour le changement d’aspect,

Strategy est fait pour le changement radical d’approche

Conséquences Personnalisation d’objets sans héritage Perte de type (perte de la relation « est-un ») Multiplication des classes (les décorations)

2011/2012

Page 10: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

Ecouteur

Notifier un événement à qui veut

2011/2012 F. Mallet 10

Page 11: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

Compteur

Gestion de l’étatclass Compteur {

private int etat = 0;

void incrementer(){

this.etat += 1;

}

int getEtat() {

return this.etat;

}

void reset() {

this.etat = 0;

}

}

Gestion de nclass CompteurModulo

extends Compteur {

private int modulo;

void incrementer() {

super.incrementer();

if (getEtat() == modulo){

super.reset();

}

}

}

2011/2012 F. Mallet 11

Page 12: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

Compteur

Gestion de l’étatclass Compteur {

private int etat = 0;

private CompteurListener ecouteur = null;

void incrementer(){

this.etat += 1;

}

void reset() {

if(ecouteur != null)

ecouteur.miseAZero();

this.etat = 0;

}

}

Ecouteur

interface CompteurListener {

void miseAZero();

}

2011/2012 F. Mallet 12

Page 13: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

Compteurclass Compteur {

private int etat = 0;

private CompteurListener ecouteur = null;

void incrementer(){

this.etat += 1;

}

void setListener(CompteurListener l){

ecouteur = l;

}

void reset() {

if(ecouteur != null)

ecouteur.misAZero();

this.etat = 0;

}

}

2011/2012 F. Mallet 13

Page 14: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

Horlogeclass Horloge{

private CompteurModulo secondes, minutes;

Horloge(int sec, int min) {

this.secondes = new CompteurModulo(60, sec);

this.minutes = new CompteurModulo(60, min);

}

void incrementer() { // les secondes

this.secondes.incrementer();

if(this.secondes.etat == 0)

incrementerMinutes();

}

void incrementerMinutes() {

this.minutes.incrementer();

}

}

2011/2012 F. Mallet 14

Page 15: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

Une horloge h: 12 min 59 secondesh.incrementer();h.secondes.incrementer();h.secondes.ecouteur.miseAZero();

2011/2012 F. Mallet 15

h.incrementer()

incrementer()

miseAZero()

0

Page 16: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

Horlogeclass Horloge implements CompteurListener {

private CompteurModulo secondes, minutes;

Horloge(int sec, int min) {

this.secondes = new CompteurModulo(60, sec);

this.minutes = new CompteurModulo(60, min);

this.secondes.addListener(this);

}

void incrementer() { // les secondes

this.secondes.incrementer();

}

public void miseAZero() {

this.incrementerMinutes();

}

void incrementerMinutes() {

this.minutes.incrementer();

}

}

2011/2012 F. Mallet 16

{

}

Page 17: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

Une horloge h: 12 min 59 secondesh.incrementer();h.secondes.incrementer();h.secondes.ecouteur.miseAZero();

2011/2012 F. Mallet 17

h.incrementer()

incrementer()

miseAZero()

h.minutes.incrementer();h.miseAZero();

incrementer()

0

13

Page 18: Patrons de conception: Décorateurs, écouteursdeptinfo.unice.fr/~fmallet/java/cours5.pdf ·  · 2012-03-26Patrons de conception: décorateur, écouteur 2011/2012 F. Mallet 2 Chapitre

Patrons de conception: décorateur, écouteur

Ecouteur et Décorateur

Un écouteur peut en cacher d’autresclass Ecouteurs implements CompteurListener {

ArrayList<CompteurListener> ecouteurs =

new ArrayList<CompteurListener>();

void add(CompteurListener e) {

ecouteurs.add(e);

}

public void miseAZero() {

for(CompteurListener cl : ecouteurs)

cl.miseAZero();

}

}

2011/2012 F. Mallet 18