formations en informatique de lille | fil - conception orient´ee objet · 2013-10-10 · quelques...

53
Singleton Decorator Factory Temp. Meth. Strategy Observer ... Quelques Design Patterns Conception Orient´ ee Objet Jean-Christophe Routier Licence mention Informatique Universit´ e Lille 1 Universit´ e Lille 1 - Licence Informatique Conception Orient´ ee Objet 1

Upload: others

Post on 03-Jun-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

Singleton Decorator Factory Temp. Meth. Strategy Observer ...

Decorator

exemple : BufferedReader dans java.io

Universite Lille 1 - Licence Informatique Conception Orientee Objet 6

Page 11: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

Singleton Decorator Factory Temp. Meth. Strategy Observer ...

Gestion des ressources

Universite Lille 1 - Licence Informatique Conception Orientee Objet 9

Page 14: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

Singleton Decorator Factory Temp. Meth. Strategy Observer ...

Gestion des ressources

Universite Lille 1 - Licence Informatique Conception Orientee Objet 9

Page 15: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

Singleton Decorator Factory Temp. Meth. Strategy Observer ...

Cargaisons

Universite Lille 1 - Licence Informatique Conception Orientee Objet 13

Page 19: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

Singleton Decorator Factory Temp. Meth. Strategy Observer ...

Cargaisons

Universite Lille 1 - Licence Informatique Conception Orientee Objet 13

Page 20: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

Singleton Decorator Factory Temp. Meth. Strategy Observer ...

Exemple : des compteurs

Universite Lille 1 - Licence Informatique Conception Orientee Objet 15

Page 22: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

Singleton Decorator Factory Temp. Meth. Strategy Observer ...

Exemple : strategies de jeu

Universite Lille 1 - Licence Informatique Conception Orientee Objet 18

Page 25: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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: Formations en Informatique de Lille | fil - Conception Orient´ee Objet · 2013-10-10 · Quelques Design Patterns Conception Orient´ee Objet Jean-Christophe Routier Licence mention

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