SlideShare une entreprise Scribd logo
1  sur  53
Télécharger pour lire hors ligne
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Quelques Design Patterns
Conception Orientée Objet
Jean-Christophe Routier
Licence mention Informatique
Université Lille 1
Université Lille 1 - Licence Informatique Conception Orientée Objet 1
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Un exemple connu
Université Lille 1 - Licence Informatique Conception Orientée Objet 2
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Un exemple connu : plusieurs design patterns
Factory method,
Université Lille 1 - Licence Informatique Conception Orientée Objet 2
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Un exemple connu : plusieurs design patterns
Factory method, Singleton,
Université Lille 1 - Licence Informatique Conception Orientée Objet 2
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Un exemple connu : plusieurs design patterns
Factory method, Singleton, Template method
Université Lille 1 - Licence Informatique Conception Orientée Objet 2
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Un exemple connu : plusieurs design patterns
Factory method, Singleton, Template method et décorateur.
Université Lille 1 - Licence Informatique Conception Orientée Objet 2
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Singleton
Ensure a class only has one instance, and provide a global point of access
to it.
I Possible pour toute classe “sans état” ou avec état “invariable”.
Mise en œuvre :
I Rendre privé le constructeur,
I Construire une instance de la classe comme “dans” la classe,
I Fournir une méthode d’accès à cette instance
Université Lille 1 - Licence Informatique Conception Orientée Objet 3
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; }
}
ou
public class SingletonClass {
private SingletonClass() { }
public static final SingletonClass seuleInstance = new SingletonClass();
}
I Usage un peu détourné : faible nombre d’instances :
,→ implémentation des types énumérés en Java (< 1.5)
Université Lille 1 - Licence Informatique Conception Orientée Objet 4
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Decorator
Attach additional responsibilities to an object dynamically. Decorators
provide a flexible alternative to subclassing for extending functionality.
Université Lille 1 - Licence Informatique Conception Orientée Objet 5
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Decorator
exemple : BufferedReader dans java.io
Université Lille 1 - Licence Informatique Conception Orientée Objet 6
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Factory Method
Define an interface for creating an object, but let subclasses decide which
class to instantiate. Factory Method lets a class defer instantiation to
subclasses.
“virtual constructor”
I L’ajout de nouvelles classes se fait grâce au polymorphisme
⇒ modifications au niveau des méthodes héritées
I MAIS il reste à créer les instances,
⇒ effets aux endroits où sont créés les objets
À utiliser quand :
I une classe ne peut pas anticiper la classe des objets qu’elle doit créer
I une classe veut que ses sous-classes spécifient les objets qu’elle crée.
exemples : méthode iterator() dans Collection
Université Lille 1 - Licence Informatique Conception Orientée Objet 7
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Construction gérée 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);
}
}// Normale
avec
public interface CaseGraphique {
public void display();
}
public class CaseGraphiqueOie implements CaseGraphique { ... }
public class CaseGraphiqueNormale implements CaseGraphique {... }
public class CaseGraphiqueAttente implements CaseGraphique { ... }
Université Lille 1 - Licence Informatique Conception Orientée Objet 8
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Gestion des ressources
Université Lille 1 - Licence Informatique Conception Orientée Objet 9
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Gestion des ressources
Université Lille 1 - Licence Informatique Conception Orientée Objet 9
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Template method
Define the skeleton of an algorithm in an operation, deferring some steps
to subclasses. Template Method lets subclasses redefine certain steps of an
algorithm without changing the algorithm’s structure.
Université Lille 1 - Licence Informatique Conception Orientée Objet 10
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Jeux à 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);
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 11
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Jeux à 2 joueurs
Les sous-classes redéfinissent certaines étapes de l’algorithme :
isFinalSituation, getWinner
Université Lille 1 - Licence Informatique Conception Orientée Objet 12
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Cargaisons
Université Lille 1 - Licence Informatique Conception Orientée Objet 13
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Cargaisons
Université Lille 1 - Licence Informatique Conception Orientée Objet 13
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Strategy
Define a family of algorithms, encapsulate each one, and make them
interchangeable. Strategy lets the algorithm vary independently from clients
that use it.
JPanel et LayoutManager
Counter et IncrementFunction ou Joueur et Strategie
Université Lille 1 - Licence Informatique Conception Orientée Objet 14
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Exemple : des compteurs
Université Lille 1 - Licence Informatique Conception Orientée Objet 15
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());
Université Lille 1 - Licence Informatique Conception Orientée Objet 16
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Exemple : stratégies de jeu
public interface Strategie {
public Coup calculDuCoupAJouer (...); // classe Coup définie "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 aléatoire
}
public class StrategieImpl implements Strategie {
public Coup calculDuCoupAJouer (...) { ... }; // un autre calcul
}
// ... utilisation
Joueur joueur1 = new Joueur(new StrategieAleatoire());
Joueur joueur2 = new Joueur(new StrategieImpl());
new Jeu(joueur1, joueur2).unTourDeJeu();
Université Lille 1 - Licence Informatique Conception Orientée Objet 17
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Exemple : stratégies de jeu
Université Lille 1 - Licence Informatique Conception Orientée Objet 18
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Observer/Observable
Define a one-to-many dependency between objects so that when one object
changes state, all its dependents are notified and updated automatically.
I Observer/Observable ou Abonneur/Abonné ou “event generator” idiom
Université Lille 1 - Licence Informatique Conception Orientée Objet 19
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Problème
Un objet (acteur) doit réagir lorsqu’un autre objet remarque un événement,
mais ce dernier n’a pas nécessairement conscience de l’existence de l’acteur
(en fait des acteurs).
Les (ré)acteurs peuvent :
I être de différentes natures
I changer sans que l’émetteur de l’événement en soit conscient
Exemple :
I la gestion des événements dans awt/Swing
Université Lille 1 - Licence Informatique Conception Orientée Objet 20
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Les contraintes
I Plusieurs objets peuvent être avertis des événements émis par une
source
I Le nombre et la nature des objets avertis ne sont potentiellement pas
connus à la compilation et peuvent changer dans le temps.
I L’émetteur de l’événement et le récepteur ne sont pas fortement liés.
⇒ Mettre en place un mécanisme de délégation entre l’émetteur de
l’événement (event generator) et le récepteur (listener)
Scénario (d’après B. Venners)
Un téléphone sonne, différentes personnes ou machines peuvent
potentiellement être concernées par l’appel. Les personnes peuvent sortir ou
entrer dans la pièce et ainsi sortir ou entrer du “champ d’intéressement” du
téléphone.
Université Lille 1 - Licence Informatique Conception Orientée Objet 21
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Les étapes de design en Java
1 Définir les classes d’événements
2 Définir les interfaces des listeners
I Définir les classes des adapters (optionnel)
3 Définir la classe émettrice (génératrice des événements)
4 Définir les classes réceptrices (les listeners)
Université Lille 1 - Licence Informatique Conception Orientée Objet 22
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 1 : définir les classes d’événements
I Définir une classe par type d’événements qui peuvent être émis par le
générateur d’événements
I Faire hériter ces classes de java.util.EventObject
I Concevoir les classes d’événements de telle sorte qu’un événement
englobe toute l’information qui doit être transmise à l’observateur
I Donner à une classe d’évenement un nom de la forme XXXEvent
Université Lille 1 - Licence Informatique Conception Orientée Objet 23
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 1 : définir les classes d’événements
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’être abonné à
plusieurs sources pour le même type d’évenements
Université Lille 1 - Licence Informatique Conception Orientée Objet 24
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 2 : définir les interfaces des listeners
I pour chaque type d’événements, définir une interface qui hérite de
java.util.EventListener et contient, pour chaque événement, une
déclaration de méthode qui sera déclenchée lors de la notification de
l’occurrence d’un événement
package essais.observer;
public interface TelephoneListener extends java.util.EventListener {
public void telephoneRang(TelephoneEvent e);
public void telephoneAnswered(TelephoneEvent e);
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 25
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 2 : définir les interfaces des listeners
I pour chaque type d’événements, définir une interface qui hérite de
java.util.EventListener et contient, pour chaque événement, une
déclaration de méthode qui sera déclenchée lors de la notification de
l’occurrence d’un événement
I Le nom de cette interface est obtenu à partir du nom de la classe de
l’événement en remplaçant Event par Listener
package essais.observer;
public interface TelephoneListener extends java.util.EventListener {
public void telephoneRang(TelephoneEvent e);
public void telephoneAnswered(TelephoneEvent e);
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 25
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 2 : définir les interfaces des listeners
I pour chaque type d’événements, définir une interface qui hérite de
java.util.EventListener et contient, pour chaque événement, une
déclaration de méthode qui sera déclenchée lors de la notification de
l’occurrence d’un événement
I Le nom de cette interface est obtenu à partir du nom de la classe de
l’événement en remplaçant Event par Listener
I Les noms des méthodes de l’interface sont construits à partir d’un
verbe au passé indiquant la situation d’activation.
package essais.observer;
public interface TelephoneListener extends java.util.EventListener {
public void telephoneRang(TelephoneEvent e);
public void telephoneAnswered(TelephoneEvent e);
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 25
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 2 : définir les interfaces des listeners
I pour chaque type d’événements, définir une interface qui hérite de
java.util.EventListener et contient, pour chaque événement, une
déclaration de méthode qui sera déclenchée lors de la notification de
l’occurrence d’un événement
I Le nom de cette interface est obtenu à partir du nom de la classe de
l’événement en remplaçant Event par Listener
I Les noms des méthodes de l’interface sont construits à partir d’un
verbe au passé indiquant la situation d’activation.
I Chaque méthode retourne void et prend un paramètre qui est de la
classe de l’événement
package essais.observer;
public interface TelephoneListener extends java.util.EventListener {
public void telephoneRang(TelephoneEvent e);
public void telephoneAnswered(TelephoneEvent e);
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 25
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 2 (option) : définir les classes des adapters
Etape optionnelle
I Pour chaque listener on définit une classe qui l’implémente en
définissant des méthodes creuses
package essais.observer;
public class TelephoneAdapter implements TelephoneListener {
public void telephoneRang(TelephoneEvent e) { }
public void telephoneAnswered(TelephoneEvent e) { }
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 26
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 2 (option) : définir les classes des adapters
Etape optionnelle
I Pour chaque listener on définit une classe qui l’implémente en
définissant des méthodes creuses
I La classe de l’adapter est obtenue en remplaçant Listener par Adapter.
package essais.observer;
public class TelephoneAdapter implements TelephoneListener {
public void telephoneRang(TelephoneEvent e) { }
public void telephoneAnswered(TelephoneEvent e) { }
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 26
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 3 : définir la classe émettrice
C’est la classe génératrice des événements.
I Pour chaque type d’événements émis, définir un couple de méthodes
add/remove
Université Lille 1 - Licence Informatique Conception Orientée Objet 27
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 3 : définir la classe émettrice
C’est la classe génératrice des événements.
I Pour chaque type d’événements émis, définir un couple de méthodes
add/remove
I Le nom de ces méthodes est de la forme : addlistener-interface-name()
et removelistener-interface-name().
Méthode d’abonnement, désabonnement
Université Lille 1 - Licence Informatique Conception Orientée Objet 27
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 3 : définir la classe émettrice
C’est la classe génératrice des événements.
I Pour chaque type d’événements émis, définir un couple de méthodes
add/remove
I Le nom de ces méthodes est de la forme : addlistener-interface-name()
et removelistener-interface-name().
Méthode d’abonnement, désabonnement
I Pour chacune des méthodes des interfaces des listeners, définir une
méthode private de propagation de l’événement.
Université Lille 1 - Licence Informatique Conception Orientée Objet 27
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 3 : définir la classe émettrice
C’est la classe génératrice des événements.
I Pour chaque type d’événements émis, définir un couple de méthodes
add/remove
I Le nom de ces méthodes est de la forme : addlistener-interface-name()
et removelistener-interface-name().
Méthode d’abonnement, désabonnement
I Pour chacune des méthodes des interfaces des listeners, définir une
méthode private de propagation de l’événement.
I Cette méthode est nommée : firelistener-method-name.
Université Lille 1 - Licence Informatique Conception Orientée Objet 27
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 3 : définir la classe émettrice
C’est la classe génératrice des événements.
I Pour chaque type d’événements émis, définir un couple de méthodes
add/remove
I Le nom de ces méthodes est de la forme : addlistener-interface-name()
et removelistener-interface-name().
Méthode d’abonnement, désabonnement
I Pour chacune des méthodes des interfaces des listeners, définir une
méthode private de propagation de l’événement.
I Cette méthode est nommée : firelistener-method-name.
I Déclencher les événements.
Université Lille 1 - Licence Informatique Conception Orientée Objet 27
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 3 : définir la classe émettrice
package essais.observer;
import java.util.*;
public class Telephone {
private ArrayList<TelephoneListener> telephoneListeners = new ArrayList<TelephoneListener>();
Université Lille 1 - Licence Informatique Conception Orientée Objet 28
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 3 : définir la classe émettrice
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);
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 28
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 3 : définir la classe émettrice
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);
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 28
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 3 : définir la classe émettrice
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);
}
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 28
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 3 : définir la classe émettrice
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() { ... }
Université Lille 1 - Licence Informatique Conception Orientée Objet 28
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 3 : définir la classe émettrice
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(); }
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 28
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 4 : définir les classes réceptrices
I Les classes qui veulent être des listeners n’ont qu’à implémenter
l’interface listener associée
Université Lille 1 - Licence Informatique Conception Orientée Objet 29
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 4 : définir les classes réceptrices
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.");
}
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 30
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 4 : définir les classes réceptrices
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!");
}
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 30
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Étape 4 : définir les classes réceptrices
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());
}
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 30
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Exploitation
package essais.observer;
public class Example1 {
public static void main(String[] args) {
Telephone ph = new Telephone(); // émetteur
AnsweringMachine am = new AnsweringMachine(); //listener
Person bob = new Person(); // ‘‘possède’’ un listener
ph.addTelephoneListener(am); // abonnement
bob.listenToPhone(ph); // abonnement
ph.ringPhone(); // provoque l’émission
ph.answerPhone(); // d’un événement
}
}
Université Lille 1 - Licence Informatique Conception Orientée Objet 31
Singleton Decorator Factory Temp. Meth. Strategy Observer ...
Règles d’implémentation
I passer la même instance à tous les listeners pour un événement donné
I rendre l’objet événement immuable
I utiliser un seul thread pour avertir tous les listeners
I créer une image de la liste des listeners abonnés avant de les avertir
I les méthodes des listeners doivent être éxécutées rapidement (car
notifiés 1 par 1)
I l’ordre des notifications ne doit pas être important
I créer des adapters pour permettre aux listeners de se concentrer que
sur certains événements.
I différences de fréquences entre l’occurrence de deux évenements émis
par une même source : créer des listeners différents
cf. MouseListener et MouseMotionListener
I java.util.Observer et java.util.Observable
Université Lille 1 - Licence Informatique Conception Orientée Objet 32

Contenu connexe

Similaire à quelques-patterns- patrons de conception

13multithreaded Programming
13multithreaded Programming13multithreaded Programming
13multithreaded ProgrammingAdil Jafri
 
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDK
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDKEric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDK
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDKGuardSquare
 
Droidcon2013 pro guard, optimizer and obfuscator in the android sdk_eric lafo...
Droidcon2013 pro guard, optimizer and obfuscator in the android sdk_eric lafo...Droidcon2013 pro guard, optimizer and obfuscator in the android sdk_eric lafo...
Droidcon2013 pro guard, optimizer and obfuscator in the android sdk_eric lafo...Droidcon Berlin
 
Strategy Design Pattern
Strategy Design PatternStrategy Design Pattern
Strategy Design PatternGanesh Kolhe
 
From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)Jose Manuel Pereira Garcia
 
Design pattern - part 3
Design pattern - part 3Design pattern - part 3
Design pattern - part 3Jieyi Wu
 
Grigoriu tudor 341 c5_(tudorgrigoriu@yahoo.com)_designpatterns
Grigoriu tudor 341 c5_(tudorgrigoriu@yahoo.com)_designpatternsGrigoriu tudor 341 c5_(tudorgrigoriu@yahoo.com)_designpatterns
Grigoriu tudor 341 c5_(tudorgrigoriu@yahoo.com)_designpatternsTudor Grigoriu
 
.Net december 2017 updates - Tamir Dresher
.Net december 2017 updates - Tamir Dresher.Net december 2017 updates - Tamir Dresher
.Net december 2017 updates - Tamir DresherTamir Dresher
 
TWINS: OOP and FP - Warburton
TWINS: OOP and FP - WarburtonTWINS: OOP and FP - Warburton
TWINS: OOP and FP - WarburtonCodemotion
 
Design patterns in java script, jquery, angularjs
Design patterns in java script, jquery, angularjsDesign patterns in java script, jquery, angularjs
Design patterns in java script, jquery, angularjsRavi Bhadauria
 
Lesson12 other behavioural patterns
Lesson12 other behavioural patternsLesson12 other behavioural patterns
Lesson12 other behavioural patternsOktJona
 
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)PROIDEA
 
Implementing one feature set in two JavaScript engines (Web Engines Hackfest ...
Implementing one feature set in two JavaScript engines (Web Engines Hackfest ...Implementing one feature set in two JavaScript engines (Web Engines Hackfest ...
Implementing one feature set in two JavaScript engines (Web Engines Hackfest ...Igalia
 
Functional Reactive Programming on Android
Functional Reactive Programming on AndroidFunctional Reactive Programming on Android
Functional Reactive Programming on AndroidSam Lee
 

Similaire à quelques-patterns- patrons de conception (20)

13multithreaded Programming
13multithreaded Programming13multithreaded Programming
13multithreaded Programming
 
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDK
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDKEric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDK
Eric Lafortune - ProGuard: Optimizer and obfuscator in the Android SDK
 
Droidcon2013 pro guard, optimizer and obfuscator in the android sdk_eric lafo...
Droidcon2013 pro guard, optimizer and obfuscator in the android sdk_eric lafo...Droidcon2013 pro guard, optimizer and obfuscator in the android sdk_eric lafo...
Droidcon2013 pro guard, optimizer and obfuscator in the android sdk_eric lafo...
 
Strategy Design Pattern
Strategy Design PatternStrategy Design Pattern
Strategy Design Pattern
 
Software Design Patterns
Software Design PatternsSoftware Design Patterns
Software Design Patterns
 
From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)
 
Design pattern - part 3
Design pattern - part 3Design pattern - part 3
Design pattern - part 3
 
Grigoriu tudor 341 c5_(tudorgrigoriu@yahoo.com)_designpatterns
Grigoriu tudor 341 c5_(tudorgrigoriu@yahoo.com)_designpatternsGrigoriu tudor 341 c5_(tudorgrigoriu@yahoo.com)_designpatterns
Grigoriu tudor 341 c5_(tudorgrigoriu@yahoo.com)_designpatterns
 
.Net december 2017 updates - Tamir Dresher
.Net december 2017 updates - Tamir Dresher.Net december 2017 updates - Tamir Dresher
.Net december 2017 updates - Tamir Dresher
 
TWINS: OOP and FP - Warburton
TWINS: OOP and FP - WarburtonTWINS: OOP and FP - Warburton
TWINS: OOP and FP - Warburton
 
C# 6.0 Preview
C# 6.0 PreviewC# 6.0 Preview
C# 6.0 Preview
 
04 threads
04 threads04 threads
04 threads
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
5 raii
5 raii5 raii
5 raii
 
5 raii
5 raii5 raii
5 raii
 
Design patterns in java script, jquery, angularjs
Design patterns in java script, jquery, angularjsDesign patterns in java script, jquery, angularjs
Design patterns in java script, jquery, angularjs
 
Lesson12 other behavioural patterns
Lesson12 other behavioural patternsLesson12 other behavioural patterns
Lesson12 other behavioural patterns
 
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)
 
Implementing one feature set in two JavaScript engines (Web Engines Hackfest ...
Implementing one feature set in two JavaScript engines (Web Engines Hackfest ...Implementing one feature set in two JavaScript engines (Web Engines Hackfest ...
Implementing one feature set in two JavaScript engines (Web Engines Hackfest ...
 
Functional Reactive Programming on Android
Functional Reactive Programming on AndroidFunctional Reactive Programming on Android
Functional Reactive Programming on Android
 

Dernier

High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escortsranjana rawat
 
Porous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingPorous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingrakeshbaidya232001
 
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...Christo Ananth
 
(TARA) Talegaon Dabhade Call Girls Just Call 7001035870 [ Cash on Delivery ] ...
(TARA) Talegaon Dabhade Call Girls Just Call 7001035870 [ Cash on Delivery ] ...(TARA) Talegaon Dabhade Call Girls Just Call 7001035870 [ Cash on Delivery ] ...
(TARA) Talegaon Dabhade Call Girls Just Call 7001035870 [ Cash on Delivery ] ...ranjana rawat
 
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur High Profile
 
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...Dr.Costas Sachpazis
 
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...ranjana rawat
 
IMPLICATIONS OF THE ABOVE HOLISTIC UNDERSTANDING OF HARMONY ON PROFESSIONAL E...
IMPLICATIONS OF THE ABOVE HOLISTIC UNDERSTANDING OF HARMONY ON PROFESSIONAL E...IMPLICATIONS OF THE ABOVE HOLISTIC UNDERSTANDING OF HARMONY ON PROFESSIONAL E...
IMPLICATIONS OF THE ABOVE HOLISTIC UNDERSTANDING OF HARMONY ON PROFESSIONAL E...RajaP95
 
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCollege Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCall Girls in Nagpur High Profile
 
UNIT-III FMM. DIMENSIONAL ANALYSIS
UNIT-III FMM.        DIMENSIONAL ANALYSISUNIT-III FMM.        DIMENSIONAL ANALYSIS
UNIT-III FMM. DIMENSIONAL ANALYSISrknatarajan
 
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptxDecoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptxJoão Esperancinha
 
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSAPPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSKurinjimalarL3
 
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...ranjana rawat
 
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escortsranjana rawat
 
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur High Profile
 
SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )Tsuyoshi Horigome
 
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130Suhani Kapoor
 
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service NashikCall Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service NashikCall Girls in Nagpur High Profile
 

Dernier (20)

High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Isha Call 7001035870 Meet With Nagpur Escorts
 
Porous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingPorous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writing
 
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
Call for Papers - African Journal of Biological Sciences, E-ISSN: 2663-2187, ...
 
(TARA) Talegaon Dabhade Call Girls Just Call 7001035870 [ Cash on Delivery ] ...
(TARA) Talegaon Dabhade Call Girls Just Call 7001035870 [ Cash on Delivery ] ...(TARA) Talegaon Dabhade Call Girls Just Call 7001035870 [ Cash on Delivery ] ...
(TARA) Talegaon Dabhade Call Girls Just Call 7001035870 [ Cash on Delivery ] ...
 
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINEDJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
 
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
 
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
 
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
 
IMPLICATIONS OF THE ABOVE HOLISTIC UNDERSTANDING OF HARMONY ON PROFESSIONAL E...
IMPLICATIONS OF THE ABOVE HOLISTIC UNDERSTANDING OF HARMONY ON PROFESSIONAL E...IMPLICATIONS OF THE ABOVE HOLISTIC UNDERSTANDING OF HARMONY ON PROFESSIONAL E...
IMPLICATIONS OF THE ABOVE HOLISTIC UNDERSTANDING OF HARMONY ON PROFESSIONAL E...
 
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCollege Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
 
UNIT-III FMM. DIMENSIONAL ANALYSIS
UNIT-III FMM.        DIMENSIONAL ANALYSISUNIT-III FMM.        DIMENSIONAL ANALYSIS
UNIT-III FMM. DIMENSIONAL ANALYSIS
 
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptxDecoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
 
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSAPPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
 
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
 
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
 
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur EscortsHigh Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
High Profile Call Girls Nagpur Meera Call 7001035870 Meet With Nagpur Escorts
 
SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )
 
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
 
Roadmap to Membership of RICS - Pathways and Routes
Roadmap to Membership of RICS - Pathways and RoutesRoadmap to Membership of RICS - Pathways and Routes
Roadmap to Membership of RICS - Pathways and Routes
 
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service NashikCall Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
 

quelques-patterns- patrons de conception

  • 1. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Quelques Design Patterns Conception Orientée Objet Jean-Christophe Routier Licence mention Informatique Université Lille 1 Université Lille 1 - Licence Informatique Conception Orientée Objet 1
  • 2. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Un exemple connu Université Lille 1 - Licence Informatique Conception Orientée Objet 2
  • 3. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Un exemple connu : plusieurs design patterns Factory method, Université Lille 1 - Licence Informatique Conception Orientée Objet 2
  • 4. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Un exemple connu : plusieurs design patterns Factory method, Singleton, Université Lille 1 - Licence Informatique Conception Orientée Objet 2
  • 5. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Un exemple connu : plusieurs design patterns Factory method, Singleton, Template method Université Lille 1 - Licence Informatique Conception Orientée Objet 2
  • 6. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Un exemple connu : plusieurs design patterns Factory method, Singleton, Template method et décorateur. Université Lille 1 - Licence Informatique Conception Orientée Objet 2
  • 7. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Singleton Ensure a class only has one instance, and provide a global point of access to it. I Possible pour toute classe “sans état” ou avec état “invariable”. Mise en œuvre : I Rendre privé le constructeur, I Construire une instance de la classe comme “dans” la classe, I Fournir une méthode d’accès à cette instance Université Lille 1 - Licence Informatique Conception Orientée Objet 3
  • 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; } } ou public class SingletonClass { private SingletonClass() { } public static final SingletonClass seuleInstance = new SingletonClass(); } I Usage un peu détourné : faible nombre d’instances : ,→ implémentation des types énumérés en Java (< 1.5) Université Lille 1 - Licence Informatique Conception Orientée Objet 4
  • 9. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Decorator Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. Université Lille 1 - Licence Informatique Conception Orientée Objet 5
  • 10. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Decorator exemple : BufferedReader dans java.io Université Lille 1 - Licence Informatique Conception Orientée Objet 6
  • 11. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Factory Method Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses. “virtual constructor” I L’ajout de nouvelles classes se fait grâce au polymorphisme ⇒ modifications au niveau des méthodes héritées I MAIS il reste à créer les instances, ⇒ effets aux endroits où sont créés les objets À utiliser quand : I une classe ne peut pas anticiper la classe des objets qu’elle doit créer I une classe veut que ses sous-classes spécifient les objets qu’elle crée. exemples : méthode iterator() dans Collection Université Lille 1 - Licence Informatique Conception Orientée Objet 7
  • 12. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Construction gérée 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); } }// Normale avec public interface CaseGraphique { public void display(); } public class CaseGraphiqueOie implements CaseGraphique { ... } public class CaseGraphiqueNormale implements CaseGraphique {... } public class CaseGraphiqueAttente implements CaseGraphique { ... } Université Lille 1 - Licence Informatique Conception Orientée Objet 8
  • 13. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Gestion des ressources Université Lille 1 - Licence Informatique Conception Orientée Objet 9
  • 14. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Gestion des ressources Université Lille 1 - Licence Informatique Conception Orientée Objet 9
  • 15. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Template method Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure. Université Lille 1 - Licence Informatique Conception Orientée Objet 10
  • 16. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Jeux à 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); } Université Lille 1 - Licence Informatique Conception Orientée Objet 11
  • 17. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Jeux à 2 joueurs Les sous-classes redéfinissent certaines étapes de l’algorithme : isFinalSituation, getWinner Université Lille 1 - Licence Informatique Conception Orientée Objet 12
  • 18. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Cargaisons Université Lille 1 - Licence Informatique Conception Orientée Objet 13
  • 19. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Cargaisons Université Lille 1 - Licence Informatique Conception Orientée Objet 13
  • 20. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Strategy Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. JPanel et LayoutManager Counter et IncrementFunction ou Joueur et Strategie Université Lille 1 - Licence Informatique Conception Orientée Objet 14
  • 21. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Exemple : des compteurs Université Lille 1 - Licence Informatique Conception Orientée Objet 15
  • 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()); Université Lille 1 - Licence Informatique Conception Orientée Objet 16
  • 23. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Exemple : stratégies de jeu public interface Strategie { public Coup calculDuCoupAJouer (...); // classe Coup définie "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 aléatoire } public class StrategieImpl implements Strategie { public Coup calculDuCoupAJouer (...) { ... }; // un autre calcul } // ... utilisation Joueur joueur1 = new Joueur(new StrategieAleatoire()); Joueur joueur2 = new Joueur(new StrategieImpl()); new Jeu(joueur1, joueur2).unTourDeJeu(); Université Lille 1 - Licence Informatique Conception Orientée Objet 17
  • 24. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Exemple : stratégies de jeu Université Lille 1 - Licence Informatique Conception Orientée Objet 18
  • 25. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Observer/Observable Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. I Observer/Observable ou Abonneur/Abonné ou “event generator” idiom Université Lille 1 - Licence Informatique Conception Orientée Objet 19
  • 26. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Problème Un objet (acteur) doit réagir lorsqu’un autre objet remarque un événement, mais ce dernier n’a pas nécessairement conscience de l’existence de l’acteur (en fait des acteurs). Les (ré)acteurs peuvent : I être de différentes natures I changer sans que l’émetteur de l’événement en soit conscient Exemple : I la gestion des événements dans awt/Swing Université Lille 1 - Licence Informatique Conception Orientée Objet 20
  • 27. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Les contraintes I Plusieurs objets peuvent être avertis des événements émis par une source I Le nombre et la nature des objets avertis ne sont potentiellement pas connus à la compilation et peuvent changer dans le temps. I L’émetteur de l’événement et le récepteur ne sont pas fortement liés. ⇒ Mettre en place un mécanisme de délégation entre l’émetteur de l’événement (event generator) et le récepteur (listener) Scénario (d’après B. Venners) Un téléphone sonne, différentes personnes ou machines peuvent potentiellement être concernées par l’appel. Les personnes peuvent sortir ou entrer dans la pièce et ainsi sortir ou entrer du “champ d’intéressement” du téléphone. Université Lille 1 - Licence Informatique Conception Orientée Objet 21
  • 28. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Les étapes de design en Java 1 Définir les classes d’événements 2 Définir les interfaces des listeners I Définir les classes des adapters (optionnel) 3 Définir la classe émettrice (génératrice des événements) 4 Définir les classes réceptrices (les listeners) Université Lille 1 - Licence Informatique Conception Orientée Objet 22
  • 29. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 1 : définir les classes d’événements I Définir une classe par type d’événements qui peuvent être émis par le générateur d’événements I Faire hériter ces classes de java.util.EventObject I Concevoir les classes d’événements de telle sorte qu’un événement englobe toute l’information qui doit être transmise à l’observateur I Donner à une classe d’évenement un nom de la forme XXXEvent Université Lille 1 - Licence Informatique Conception Orientée Objet 23
  • 30. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 1 : définir les classes d’événements 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’être abonné à plusieurs sources pour le même type d’évenements Université Lille 1 - Licence Informatique Conception Orientée Objet 24
  • 31. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 2 : définir les interfaces des listeners I pour chaque type d’événements, définir une interface qui hérite de java.util.EventListener et contient, pour chaque événement, une déclaration de méthode qui sera déclenchée lors de la notification de l’occurrence d’un événement package essais.observer; public interface TelephoneListener extends java.util.EventListener { public void telephoneRang(TelephoneEvent e); public void telephoneAnswered(TelephoneEvent e); } Université Lille 1 - Licence Informatique Conception Orientée Objet 25
  • 32. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 2 : définir les interfaces des listeners I pour chaque type d’événements, définir une interface qui hérite de java.util.EventListener et contient, pour chaque événement, une déclaration de méthode qui sera déclenchée lors de la notification de l’occurrence d’un événement I Le nom de cette interface est obtenu à partir du nom de la classe de l’événement en remplaçant Event par Listener package essais.observer; public interface TelephoneListener extends java.util.EventListener { public void telephoneRang(TelephoneEvent e); public void telephoneAnswered(TelephoneEvent e); } Université Lille 1 - Licence Informatique Conception Orientée Objet 25
  • 33. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 2 : définir les interfaces des listeners I pour chaque type d’événements, définir une interface qui hérite de java.util.EventListener et contient, pour chaque événement, une déclaration de méthode qui sera déclenchée lors de la notification de l’occurrence d’un événement I Le nom de cette interface est obtenu à partir du nom de la classe de l’événement en remplaçant Event par Listener I Les noms des méthodes de l’interface sont construits à partir d’un verbe au passé indiquant la situation d’activation. package essais.observer; public interface TelephoneListener extends java.util.EventListener { public void telephoneRang(TelephoneEvent e); public void telephoneAnswered(TelephoneEvent e); } Université Lille 1 - Licence Informatique Conception Orientée Objet 25
  • 34. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 2 : définir les interfaces des listeners I pour chaque type d’événements, définir une interface qui hérite de java.util.EventListener et contient, pour chaque événement, une déclaration de méthode qui sera déclenchée lors de la notification de l’occurrence d’un événement I Le nom de cette interface est obtenu à partir du nom de la classe de l’événement en remplaçant Event par Listener I Les noms des méthodes de l’interface sont construits à partir d’un verbe au passé indiquant la situation d’activation. I Chaque méthode retourne void et prend un paramètre qui est de la classe de l’événement package essais.observer; public interface TelephoneListener extends java.util.EventListener { public void telephoneRang(TelephoneEvent e); public void telephoneAnswered(TelephoneEvent e); } Université Lille 1 - Licence Informatique Conception Orientée Objet 25
  • 35. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 2 (option) : définir les classes des adapters Etape optionnelle I Pour chaque listener on définit une classe qui l’implémente en définissant des méthodes creuses package essais.observer; public class TelephoneAdapter implements TelephoneListener { public void telephoneRang(TelephoneEvent e) { } public void telephoneAnswered(TelephoneEvent e) { } } Université Lille 1 - Licence Informatique Conception Orientée Objet 26
  • 36. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 2 (option) : définir les classes des adapters Etape optionnelle I Pour chaque listener on définit une classe qui l’implémente en définissant des méthodes creuses I La classe de l’adapter est obtenue en remplaçant Listener par Adapter. package essais.observer; public class TelephoneAdapter implements TelephoneListener { public void telephoneRang(TelephoneEvent e) { } public void telephoneAnswered(TelephoneEvent e) { } } Université Lille 1 - Licence Informatique Conception Orientée Objet 26
  • 37. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 3 : définir la classe émettrice C’est la classe génératrice des événements. I Pour chaque type d’événements émis, définir un couple de méthodes add/remove Université Lille 1 - Licence Informatique Conception Orientée Objet 27
  • 38. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 3 : définir la classe émettrice C’est la classe génératrice des événements. I Pour chaque type d’événements émis, définir un couple de méthodes add/remove I Le nom de ces méthodes est de la forme : addlistener-interface-name() et removelistener-interface-name(). Méthode d’abonnement, désabonnement Université Lille 1 - Licence Informatique Conception Orientée Objet 27
  • 39. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 3 : définir la classe émettrice C’est la classe génératrice des événements. I Pour chaque type d’événements émis, définir un couple de méthodes add/remove I Le nom de ces méthodes est de la forme : addlistener-interface-name() et removelistener-interface-name(). Méthode d’abonnement, désabonnement I Pour chacune des méthodes des interfaces des listeners, définir une méthode private de propagation de l’événement. Université Lille 1 - Licence Informatique Conception Orientée Objet 27
  • 40. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 3 : définir la classe émettrice C’est la classe génératrice des événements. I Pour chaque type d’événements émis, définir un couple de méthodes add/remove I Le nom de ces méthodes est de la forme : addlistener-interface-name() et removelistener-interface-name(). Méthode d’abonnement, désabonnement I Pour chacune des méthodes des interfaces des listeners, définir une méthode private de propagation de l’événement. I Cette méthode est nommée : firelistener-method-name. Université Lille 1 - Licence Informatique Conception Orientée Objet 27
  • 41. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 3 : définir la classe émettrice C’est la classe génératrice des événements. I Pour chaque type d’événements émis, définir un couple de méthodes add/remove I Le nom de ces méthodes est de la forme : addlistener-interface-name() et removelistener-interface-name(). Méthode d’abonnement, désabonnement I Pour chacune des méthodes des interfaces des listeners, définir une méthode private de propagation de l’événement. I Cette méthode est nommée : firelistener-method-name. I Déclencher les événements. Université Lille 1 - Licence Informatique Conception Orientée Objet 27
  • 42. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 3 : définir la classe émettrice package essais.observer; import java.util.*; public class Telephone { private ArrayList<TelephoneListener> telephoneListeners = new ArrayList<TelephoneListener>(); Université Lille 1 - Licence Informatique Conception Orientée Objet 28
  • 43. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 3 : définir la classe émettrice 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); } Université Lille 1 - Licence Informatique Conception Orientée Objet 28
  • 44. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 3 : définir la classe émettrice 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); } Université Lille 1 - Licence Informatique Conception Orientée Objet 28
  • 45. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 3 : définir la classe émettrice 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); } } Université Lille 1 - Licence Informatique Conception Orientée Objet 28
  • 46. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 3 : définir la classe émettrice 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() { ... } Université Lille 1 - Licence Informatique Conception Orientée Objet 28
  • 47. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 3 : définir la classe émettrice 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(); } } Université Lille 1 - Licence Informatique Conception Orientée Objet 28
  • 48. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 4 : définir les classes réceptrices I Les classes qui veulent être des listeners n’ont qu’à implémenter l’interface listener associée Université Lille 1 - Licence Informatique Conception Orientée Objet 29
  • 49. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 4 : définir les classes réceptrices 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."); } } Université Lille 1 - Licence Informatique Conception Orientée Objet 30
  • 50. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 4 : définir les classes réceptrices 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!"); } } Université Lille 1 - Licence Informatique Conception Orientée Objet 30
  • 51. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Étape 4 : définir les classes réceptrices 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()); } } Université Lille 1 - Licence Informatique Conception Orientée Objet 30
  • 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(); // émetteur AnsweringMachine am = new AnsweringMachine(); //listener Person bob = new Person(); // ‘‘possède’’ un listener ph.addTelephoneListener(am); // abonnement bob.listenToPhone(ph); // abonnement ph.ringPhone(); // provoque l’émission ph.answerPhone(); // d’un événement } } Université Lille 1 - Licence Informatique Conception Orientée Objet 31
  • 53. Singleton Decorator Factory Temp. Meth. Strategy Observer ... Règles d’implémentation I passer la même instance à tous les listeners pour un événement donné I rendre l’objet événement immuable I utiliser un seul thread pour avertir tous les listeners I créer une image de la liste des listeners abonnés avant de les avertir I les méthodes des listeners doivent être éxécutées rapidement (car notifiés 1 par 1) I l’ordre des notifications ne doit pas être important I créer des adapters pour permettre aux listeners de se concentrer que sur certains événements. I différences de fréquences entre l’occurrence de deux évenements émis par une même source : créer des listeners différents cf. MouseListener et MouseMotionListener I java.util.Observer et java.util.Observable Université Lille 1 - Licence Informatique Conception Orientée Objet 32