Upload
phungdang
View
219
Download
2
Embed Size (px)
Citation preview
2011/2012 F. Mallet 1
Patrons de conception:Décorateurs, écouteurs
http://deptinfo.unice.fr/~fmallet/java/gse.html
Patrons de conception: décorateur, écouteur
2011/2012 F. Mallet 2
Chapitre VI – ObjectifsPatrons de conceptions Décorateur Ecouteur
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
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
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 ?
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 ?
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
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
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
Patrons de conception: décorateur, écouteur
Ecouteur
Notifier un événement à qui veut
2011/2012 F. Mallet 10
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
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
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
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
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
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
{
}
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
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