Page 1
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Quelques Design Patterns
Conception Orientee Objet
Jean-Christophe RoutierLicence mention Informatique
Universite Lille 1
Universite Lille 1 - Licence Informatique Conception Orientee Objet 1
Page 2
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Un exemple connu
: plusieurs design patterns
Factory method, Singleton, Template method et decorateur.
Universite Lille 1 - Licence Informatique Conception Orientee Objet 2
Page 3
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Un exemple connu : plusieurs design patterns
Factory method,
Singleton, Template method et decorateur.
Universite Lille 1 - Licence Informatique Conception Orientee Objet 2
Page 4
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Un exemple connu : plusieurs design patterns
Factory method, Singleton,
Template method et decorateur.
Universite Lille 1 - Licence Informatique Conception Orientee Objet 2
Page 5
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Un exemple connu : plusieurs design patterns
Factory method, Singleton, Template method
et decorateur.
Universite Lille 1 - Licence Informatique Conception Orientee Objet 2
Page 6
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Un exemple connu : plusieurs design patterns
Factory method, Singleton, Template method et decorateur.
Universite Lille 1 - Licence Informatique Conception Orientee Objet 2
Page 7
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Singleton
Ensure a class only has one instance, and provide a global point of accessto it.
I Possible pour toute classe “sans etat” ou avec etat “invariable”.
Mise en œuvre :I Rendre prive le constructeur,I Construire une instance de la classe comme “dans” la classe,I Fournir une methode d’acces a cette instance
Universite Lille 1 - Licence Informatique Conception Orientee Objet 3
Page 8
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
En Java
public class SingletonClass {private SingletonClass() { }private SingletonClass uniqueInstance = new SingletonClass();public static SingletonClass getTheInstance() {
return uniqueInstance; }}
oupublic class SingletonClass {
private SingletonClass() { }public static final SingletonClass seuleInstance = new SingletonClass();
}
I Usage un peu detourne : faible nombre d’instances :↪→ implementation des types enumeres en Java (< 1.5)
Universite Lille 1 - Licence Informatique Conception Orientee Objet 4
Page 9
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Decorator
Attach additional responsibilities to an object dynamically. Decoratorsprovide a flexible alternative to subclassing for extending functionality.
Universite Lille 1 - Licence Informatique Conception Orientee Objet 5
Page 10
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Decorator
exemple : BufferedReader dans java.io
Universite Lille 1 - Licence Informatique Conception Orientee Objet 6
Page 11
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Factory Method
Define an interface for creating an object, but let subclasses decide whichclass to instantiate. Factory Method lets a class defer instantiation tosubclasses.
“virtual constructor”
I L’ajout de nouvelles classes se fait grace au polymorphisme⇒ modifications au niveau des methodes heritees
I MAIS il reste a creer les instances,⇒ effets aux endroits ou sont crees les objets
A utiliser quand :I une classe ne peut pas anticiper la classe des objets qu’elle doit creerI une classe veut que ses sous-classes specifient les objets qu’elle cree.
exemples : methode iterator() dans CollectionUniversite Lille 1 - Licence Informatique Conception Orientee Objet 7
Page 12
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Construction geree par les sous-classes
package oie;public abstract class AbstractCase {
(...)public abstract CaseGraphique getMonDessin();
}// AbstractCase
public class Oie extends AbstractCase {(...)public CaseGraphique getMonDessin(){
return new CaseGraphiqueOie(this.index);}
}// Oie
public class Normale extends AbstractCase {(...)public CaseGraphique getMonDessin(){
return new CaseGraphiqueNormale(this.index);}
}// Normaleavec
public interface CaseGraphique {public void display();
}public class CaseGraphiqueOie implements CaseGraphique { ... }public class CaseGraphiqueNormale implements CaseGraphique {... }public class CaseGraphiqueAttente implements CaseGraphique { ... }
Universite Lille 1 - Licence Informatique Conception Orientee Objet 8
Page 13
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Gestion des ressources
Universite Lille 1 - Licence Informatique Conception Orientee Objet 9
Page 14
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Gestion des ressources
Universite Lille 1 - Licence Informatique Conception Orientee Objet 9
Page 15
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Template method
Define the skeleton of an algorithm in an operation, deferring some stepsto subclasses. Template Method lets subclasses redefine certain steps of analgorithm without changing the algorithm’s structure.
Universite Lille 1 - Licence Informatique Conception Orientee Objet 10
Page 16
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Jeux a 2 joueurs
La « template method », play :public void play(Situation starting, Player player1, Player player2) {
this.setCurrentSituation(starting);this.player1 = player1;this.player2 = player2;this.currentPlayer = player1;
while (!this.isFinalSituation(this.currentSituation,this.currentPlayer)) {this.display();Situation playerChoice = this.currentPlayer.play(this);this.setCurrentSituation(playerChoice);this.changePlayer();
}
this.display();Player winner = this.getWinner(currentPlayer);System.out.println("**************** Winner is "+winner);
}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 11
Page 17
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Jeux a 2 joueurs
Les sous-classes redefinissent certaines etapes de l’algorithme :
isFinalSituation, getWinner
Universite Lille 1 - Licence Informatique Conception Orientee Objet 12
Page 18
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Cargaisons
Universite Lille 1 - Licence Informatique Conception Orientee Objet 13
Page 19
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Cargaisons
Universite Lille 1 - Licence Informatique Conception Orientee Objet 13
Page 20
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Strategy
Define a family of algorithms, encapsulate each one, and make theminterchangeable. Strategy lets the algorithm vary independently from clientsthat use it.
JPanel et LayoutManager
Counter et IncrementFunction ou Joueur et Strategie
Universite Lille 1 - Licence Informatique Conception Orientee Objet 14
Page 21
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Exemple : des compteurs
Universite Lille 1 - Licence Informatique Conception Orientee Objet 15
Page 22
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Exemple : des compteurs
public interface IncrementFunction {public int increment(int value);
}
public class SimpleIncrement implements IncrementFunction { ... }public class ModularIncrement implements IncrementFunction { ... }public class AnotherIncrement implements IncrementFunction { ... }
public class Counter {private int value;private IncrementFunction incrementF;public Counter(int value, IncrementFunction incrementF) {
this.value = value; his.incrementF = incrementF;}public int getCurrentValue() { return value: }public void increment() { value = incrementF.increment(value); }public void initValue(int init) { this.value = init; }
}
// ... utilisation
Counter simpleCounter = new Counter(0, new SimpleIncrement());Counter modularCounter = new Counter(0, new ModularIncrement(7));Counter anotherCounter = new Counter(0, new AnotherIncrement());
Universite Lille 1 - Licence Informatique Conception Orientee Objet 16
Page 23
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Exemple : strategies de jeu
public interface Strategie {public Coup calculDuCoupAJouer (...); // classe Coup definie "ailleurs"
}
public class Joueur {private Strategie maStrategie;public Joueur(Strategie strategie, ....) {
maStrategie = strategie; ...}public Coup joue() {
return maStrategie.calculDuCoupAJouer(...);}
}
public class StrategieAleatoire implements Strategie {public Coup calculDuCoupAJouer (...) { ... }; // choix aleatoire
}public class StrategieImpl implements Strategie {
public Coup calculDuCoupAJouer (...) { ... }; // un autre calcul}
// ... utilisationJoueur joueur1 = new Joueur(new StrategieAleatoire());Joueur joueur2 = new Joueur(new StrategieImpl());new Jeu(joueur1, joueur2).unTourDeJeu();
Universite Lille 1 - Licence Informatique Conception Orientee Objet 17
Page 24
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Exemple : strategies de jeu
Universite Lille 1 - Licence Informatique Conception Orientee Objet 18
Page 25
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Observer/Observable
Define a one-to-many dependency between objects so that when one objectchanges state, all its dependents are notified and updated automatically.
I Observer/Observable ou Abonneur/Abonne ou “event generator” idiom
Universite Lille 1 - Licence Informatique Conception Orientee Objet 19
Page 26
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Probleme
Un objet (acteur) doit reagir lorsqu’un autre objet remarque un evenement,mais ce dernier n’a pas necessairement conscience de l’existence de l’acteur(en fait des acteurs).
Les (re)acteurs peuvent :I etre de differentes naturesI changer sans que l’emetteur de l’evenement en soit conscient
Exemple :I la gestion des evenements dans awt/Swing
Universite Lille 1 - Licence Informatique Conception Orientee Objet 20
Page 27
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Les contraintes
I Plusieurs objets peuvent etre avertis des evenements emis par unesource
I Le nombre et la nature des objets avertis ne sont potentiellement pasconnus a la compilation et peuvent changer dans le temps.
I L’emetteur de l’evenement et le recepteur ne sont pas fortement lies.
⇒ Mettre en place un mecanisme de delegation entre l’emetteur del’evenement (event generator) et le recepteur (listener)
Scenario (d’apres B. Venners)
Un telephone sonne, differentes personnes ou machines peuventpotentiellement etre concernees par l’appel. Les personnes peuvent sortir ouentrer dans la piece et ainsi sortir ou entrer du “champ d’interessement” dutelephone.
Universite Lille 1 - Licence Informatique Conception Orientee Objet 21
Page 28
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Les etapes de design en Java
1 Definir les classes d’evenements2 Definir les interfaces des listeners
I Definir les classes des adapters (optionnel)3 Definir la classe emettrice (generatrice des evenements)4 Definir les classes receptrices (les listeners)
Universite Lille 1 - Licence Informatique Conception Orientee Objet 22
Page 29
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 1 : definir les classes d’evenements
I Definir une classe par type d’evenements qui peuvent etre emis par legenerateur d’evenements
I Faire heriter ces classes de java.util.EventObject
I Concevoir les classes d’evenements de telle sorte qu’un evenementenglobe toute l’information qui doit etre transmise a l’observateur
I Donner a une classe d’evenement un nom de la forme XXXEvent
Universite Lille 1 - Licence Informatique Conception Orientee Objet 23
Page 30
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 1 : definir les classes d’evenements
package essais.observer;public class TelephoneEvent extends java.util.EventObject {
public TelephoneEvent(Telephone source) {super(source);
}}
I EventObject.getSource() : disposer de la source permet d’etre abonne aplusieurs sources pour le meme type d’evenements
Universite Lille 1 - Licence Informatique Conception Orientee Objet 24
Page 31
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 2 : definir les interfaces des listeners
I pour chaque type d’evenements, definir une interface qui herite dejava.util.EventListener et contient, pour chaque evenement, unedeclaration de methode qui sera declenchee lors de la notification del’occurrence d’un evenement
I Le nom de cette interface est obtenu a partir du nom de la classe del’evenement en remplacant Event par Listener
I Les noms des methodes de l’interface sont construits a partir d’unverbe au passe indiquant la situation d’activation.
I Chaque methode retourne void et prend un parametre qui est de laclasse de l’evenement
package essais.observer;public interface TelephoneListener extends java.util.EventListener {
public void telephoneRang(TelephoneEvent e);public void telephoneAnswered(TelephoneEvent e);
}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 25
Page 32
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 2 : definir les interfaces des listeners
I pour chaque type d’evenements, definir une interface qui herite dejava.util.EventListener et contient, pour chaque evenement, unedeclaration de methode qui sera declenchee lors de la notification del’occurrence d’un evenement
I Le nom de cette interface est obtenu a partir du nom de la classe del’evenement en remplacant Event par Listener
I Les noms des methodes de l’interface sont construits a partir d’unverbe au passe indiquant la situation d’activation.
I Chaque methode retourne void et prend un parametre qui est de laclasse de l’evenement
package essais.observer;public interface TelephoneListener extends java.util.EventListener {
public void telephoneRang(TelephoneEvent e);public void telephoneAnswered(TelephoneEvent e);
}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 25
Page 33
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 2 : definir les interfaces des listeners
I pour chaque type d’evenements, definir une interface qui herite dejava.util.EventListener et contient, pour chaque evenement, unedeclaration de methode qui sera declenchee lors de la notification del’occurrence d’un evenement
I Le nom de cette interface est obtenu a partir du nom de la classe del’evenement en remplacant Event par Listener
I Les noms des methodes de l’interface sont construits a partir d’unverbe au passe indiquant la situation d’activation.
I Chaque methode retourne void et prend un parametre qui est de laclasse de l’evenement
package essais.observer;public interface TelephoneListener extends java.util.EventListener {
public void telephoneRang(TelephoneEvent e);public void telephoneAnswered(TelephoneEvent e);
}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 25
Page 34
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 2 : definir les interfaces des listeners
I pour chaque type d’evenements, definir une interface qui herite dejava.util.EventListener et contient, pour chaque evenement, unedeclaration de methode qui sera declenchee lors de la notification del’occurrence d’un evenement
I Le nom de cette interface est obtenu a partir du nom de la classe del’evenement en remplacant Event par Listener
I Les noms des methodes de l’interface sont construits a partir d’unverbe au passe indiquant la situation d’activation.
I Chaque methode retourne void et prend un parametre qui est de laclasse de l’evenement
package essais.observer;public interface TelephoneListener extends java.util.EventListener {
public void telephoneRang(TelephoneEvent e);public void telephoneAnswered(TelephoneEvent e);
}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 25
Page 35
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 2 (option) : definir les classes des adapters
Etape optionnelleI Pour chaque listener on definit une classe qui l’implemente en
definissant des methodes creuses
I La classe de l’adapter est obtenue en remplacant Listener par Adapter.
package essais.observer;public class TelephoneAdapter implements TelephoneListener {
public void telephoneRang(TelephoneEvent e) { }public void telephoneAnswered(TelephoneEvent e) { }
}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 26
Page 36
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 2 (option) : definir les classes des adapters
Etape optionnelleI Pour chaque listener on definit une classe qui l’implemente en
definissant des methodes creusesI La classe de l’adapter est obtenue en remplacant Listener par Adapter.
package essais.observer;public class TelephoneAdapter implements TelephoneListener {
public void telephoneRang(TelephoneEvent e) { }public void telephoneAnswered(TelephoneEvent e) { }
}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 26
Page 37
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 3 : definir la classe emettrice
C’est la classe generatrice des evenements.I Pour chaque type d’evenements emis, definir un couple de methodes
add/remove
I Le nom de ces methodes est de la forme : addlistener-interface-name()
et removelistener-interface-name().Methode d’abonnement, desabonnement
I Pour chacune des methodes des interfaces des listeners, definir unemethode private de propagation de l’evenement.
I Cette methode est nommee : firelistener-method-name.I Declencher les evenements.
Universite Lille 1 - Licence Informatique Conception Orientee Objet 27
Page 38
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 3 : definir la classe emettrice
C’est la classe generatrice des evenements.I Pour chaque type d’evenements emis, definir un couple de methodes
add/removeI Le nom de ces methodes est de la forme : addlistener-interface-name()
et removelistener-interface-name().Methode d’abonnement, desabonnement
I Pour chacune des methodes des interfaces des listeners, definir unemethode private de propagation de l’evenement.
I Cette methode est nommee : firelistener-method-name.I Declencher les evenements.
Universite Lille 1 - Licence Informatique Conception Orientee Objet 27
Page 39
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 3 : definir la classe emettrice
C’est la classe generatrice des evenements.I Pour chaque type d’evenements emis, definir un couple de methodes
add/removeI Le nom de ces methodes est de la forme : addlistener-interface-name()
et removelistener-interface-name().Methode d’abonnement, desabonnement
I Pour chacune des methodes des interfaces des listeners, definir unemethode private de propagation de l’evenement.
I Cette methode est nommee : firelistener-method-name.I Declencher les evenements.
Universite Lille 1 - Licence Informatique Conception Orientee Objet 27
Page 40
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 3 : definir la classe emettrice
C’est la classe generatrice des evenements.I Pour chaque type d’evenements emis, definir un couple de methodes
add/removeI Le nom de ces methodes est de la forme : addlistener-interface-name()
et removelistener-interface-name().Methode d’abonnement, desabonnement
I Pour chacune des methodes des interfaces des listeners, definir unemethode private de propagation de l’evenement.
I Cette methode est nommee : firelistener-method-name.
I Declencher les evenements.
Universite Lille 1 - Licence Informatique Conception Orientee Objet 27
Page 41
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 3 : definir la classe emettrice
C’est la classe generatrice des evenements.I Pour chaque type d’evenements emis, definir un couple de methodes
add/removeI Le nom de ces methodes est de la forme : addlistener-interface-name()
et removelistener-interface-name().Methode d’abonnement, desabonnement
I Pour chacune des methodes des interfaces des listeners, definir unemethode private de propagation de l’evenement.
I Cette methode est nommee : firelistener-method-name.I Declencher les evenements.
Universite Lille 1 - Licence Informatique Conception Orientee Objet 27
Page 42
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 3 : definir la classe emettrice
package essais.observer;import java.util.*;public class Telephone {private ArrayList<TelephoneListener> telephoneListeners = new ArrayList<TelephoneListener>();
public synchronized void addTelephoneListener(TelephoneListener l) {if (telephoneListeners.contains(l)) { return ; }telephoneListeners.add(l);
}public synchronized void removeTelephoneListener(TelephoneListener l){telephoneListeners.remove(l);
}private void fireTelephoneRang() {ArrayLis<TelephoneListener>t tl = (ArrayList<TelephoneListener>) telephoneListeners.clone();if (tl.size() == 0) { return; }TelephoneEvent event = new TelephoneEvent(this);for (TelephoneListener listener : tl) {
listener.telephoneRang(event);}
}private void fireTelephoneAnswered() { ... }public void ringPhone() { fireTelephoneRang(); }public void answerPhone() { fireTelephoneAnswered(); }
}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 28
Page 43
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 3 : definir la classe emettrice
package essais.observer;import java.util.*;public class Telephone {private ArrayList<TelephoneListener> telephoneListeners = new ArrayList<TelephoneListener>();public synchronized void addTelephoneListener(TelephoneListener l) {if (telephoneListeners.contains(l)) { return ; }telephoneListeners.add(l);
}
public synchronized void removeTelephoneListener(TelephoneListener l){telephoneListeners.remove(l);
}private void fireTelephoneRang() {ArrayLis<TelephoneListener>t tl = (ArrayList<TelephoneListener>) telephoneListeners.clone();if (tl.size() == 0) { return; }TelephoneEvent event = new TelephoneEvent(this);for (TelephoneListener listener : tl) {
listener.telephoneRang(event);}
}private void fireTelephoneAnswered() { ... }public void ringPhone() { fireTelephoneRang(); }public void answerPhone() { fireTelephoneAnswered(); }
}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 28
Page 44
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 3 : definir la classe emettrice
package essais.observer;import java.util.*;public class Telephone {private ArrayList<TelephoneListener> telephoneListeners = new ArrayList<TelephoneListener>();public synchronized void addTelephoneListener(TelephoneListener l) {if (telephoneListeners.contains(l)) { return ; }telephoneListeners.add(l);
}public synchronized void removeTelephoneListener(TelephoneListener l){telephoneListeners.remove(l);
}
private void fireTelephoneRang() {ArrayLis<TelephoneListener>t tl = (ArrayList<TelephoneListener>) telephoneListeners.clone();if (tl.size() == 0) { return; }TelephoneEvent event = new TelephoneEvent(this);for (TelephoneListener listener : tl) {
listener.telephoneRang(event);}
}private void fireTelephoneAnswered() { ... }public void ringPhone() { fireTelephoneRang(); }public void answerPhone() { fireTelephoneAnswered(); }
}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 28
Page 45
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 3 : definir la classe emettrice
package essais.observer;import java.util.*;public class Telephone {private ArrayList<TelephoneListener> telephoneListeners = new ArrayList<TelephoneListener>();public synchronized void addTelephoneListener(TelephoneListener l) {if (telephoneListeners.contains(l)) { return ; }telephoneListeners.add(l);
}public synchronized void removeTelephoneListener(TelephoneListener l){telephoneListeners.remove(l);
}private void fireTelephoneRang() {ArrayLis<TelephoneListener>t tl = (ArrayList<TelephoneListener>) telephoneListeners.clone();if (tl.size() == 0) { return; }TelephoneEvent event = new TelephoneEvent(this);for (TelephoneListener listener : tl) {
listener.telephoneRang(event);}
}
private void fireTelephoneAnswered() { ... }public void ringPhone() { fireTelephoneRang(); }public void answerPhone() { fireTelephoneAnswered(); }
}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 28
Page 46
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 3 : definir la classe emettrice
package essais.observer;import java.util.*;public class Telephone {private ArrayList<TelephoneListener> telephoneListeners = new ArrayList<TelephoneListener>();public synchronized void addTelephoneListener(TelephoneListener l) {if (telephoneListeners.contains(l)) { return ; }telephoneListeners.add(l);
}public synchronized void removeTelephoneListener(TelephoneListener l){telephoneListeners.remove(l);
}private void fireTelephoneRang() {ArrayLis<TelephoneListener>t tl = (ArrayList<TelephoneListener>) telephoneListeners.clone();if (tl.size() == 0) { return; }TelephoneEvent event = new TelephoneEvent(this);for (TelephoneListener listener : tl) {
listener.telephoneRang(event);}
}private void fireTelephoneAnswered() { ... }
public void ringPhone() { fireTelephoneRang(); }public void answerPhone() { fireTelephoneAnswered(); }
}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 28
Page 47
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 3 : definir la classe emettrice
package essais.observer;import java.util.*;public class Telephone {private ArrayList<TelephoneListener> telephoneListeners = new ArrayList<TelephoneListener>();public synchronized void addTelephoneListener(TelephoneListener l) {if (telephoneListeners.contains(l)) { return ; }telephoneListeners.add(l);
}public synchronized void removeTelephoneListener(TelephoneListener l){telephoneListeners.remove(l);
}private void fireTelephoneRang() {ArrayLis<TelephoneListener>t tl = (ArrayList<TelephoneListener>) telephoneListeners.clone();if (tl.size() == 0) { return; }TelephoneEvent event = new TelephoneEvent(this);for (TelephoneListener listener : tl) {
listener.telephoneRang(event);}
}private void fireTelephoneAnswered() { ... }public void ringPhone() { fireTelephoneRang(); }public void answerPhone() { fireTelephoneAnswered(); }
}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 28
Page 48
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 4 : definir les classes receptrices
I Les classes qui veulent etre des listeners n’ont qu’a implementerl’interface listener associee
Universite Lille 1 - Licence Informatique Conception Orientee Objet 29
Page 49
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 4 : definir les classes receptrices
package essais.observer;public class AnsweringMachine implements TelephoneListener {
public void telephoneRang(TelephoneEvent e) {System.out.println("AM hears the phone ringing.");
}public void telephoneAnswered(TelephoneEvent e) {
System.out.println("AM sees that the phone was answered.");}
}
package essais.observer;class MyTelephoneAdapter extends TelephoneAdapter {
public void telephoneRang(TelephoneEvent e) {System.out.println("I’ll get it!");
}}public class Person {
public void listenToPhone(Telephone t) {t.addTelephoneListener(new MyTelephoneAdapter());
}}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 30
Page 50
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 4 : definir les classes receptrices
package essais.observer;public class AnsweringMachine implements TelephoneListener {
public void telephoneRang(TelephoneEvent e) {System.out.println("AM hears the phone ringing.");
}public void telephoneAnswered(TelephoneEvent e) {
System.out.println("AM sees that the phone was answered.");}
}
package essais.observer;class MyTelephoneAdapter extends TelephoneAdapter {
public void telephoneRang(TelephoneEvent e) {System.out.println("I’ll get it!");
}}
public class Person {public void listenToPhone(Telephone t) {
t.addTelephoneListener(new MyTelephoneAdapter());}
}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 30
Page 51
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Etape 4 : definir les classes receptrices
package essais.observer;public class AnsweringMachine implements TelephoneListener {
public void telephoneRang(TelephoneEvent e) {System.out.println("AM hears the phone ringing.");
}public void telephoneAnswered(TelephoneEvent e) {
System.out.println("AM sees that the phone was answered.");}
}
package essais.observer;class MyTelephoneAdapter extends TelephoneAdapter {
public void telephoneRang(TelephoneEvent e) {System.out.println("I’ll get it!");
}}public class Person {
public void listenToPhone(Telephone t) {t.addTelephoneListener(new MyTelephoneAdapter());
}}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 30
Page 52
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Exploitation
package essais.observer;
public class Example1 {public static void main(String[] args) {
Telephone ph = new Telephone(); // emetteurAnsweringMachine am = new AnsweringMachine(); //listenerPerson bob = new Person(); // ‘‘possede’’ un listener
ph.addTelephoneListener(am); // abonnementbob.listenToPhone(ph); // abonnement
ph.ringPhone(); // provoque l’emissionph.answerPhone(); // d’un evenement
}}
Universite Lille 1 - Licence Informatique Conception Orientee Objet 31
Page 53
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Regles d’implementation
I passer la meme instance a tous les listeners pour un evenement donneI rendre l’objet evenement immuableI utiliser un seul thread pour avertir tous les listenersI creer une image de la liste des listeners abonnes avant de les avertirI les methodes des listeners doivent etre executees rapidement (car
notifies 1 par 1)I l’ordre des notifications ne doit pas etre importantI creer des adapters pour permettre aux listeners de se concentrer que
sur certains evenements.
I differences de frequences entre l’occurrence de deux evenements emispar une meme source : creer des listeners differentscf. MouseListener et MouseMotionListener
I java.util.Observer et java.util.Observable
Universite Lille 1 - Licence Informatique Conception Orientee Objet 32