0% ont trouvé ce document utile (0 vote)
151 vues32 pages

Introduction au Patron Observer en Java

Le document décrit le patron de conception Observer. Ce patron définit une relation entre un objet sujet et plusieurs observateurs, de sorte que les observateurs soient notifiés automatiquement des changements d'état du sujet.

Transféré par

Yin Yang
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
151 vues32 pages

Introduction au Patron Observer en Java

Le document décrit le patron de conception Observer. Ce patron définit une relation entre un objet sujet et plusieurs observateurs, de sorte que les observateurs soient notifiés automatiquement des changements d'état du sujet.

Transféré par

Yin Yang
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Université Badji Mokhtar, Annaba

Faculté des sciences de l’ingéniorat


département d’informatique
Master 1: Réseaux et sécurité informatique

Le patron Observateur

Observer Pattern

Préparé par MAA [Link]


Avril 2020

1
But
•  Définit une relation de dépendance 1 à N
entre les objets de telle manière que si un
objet change d’état, tous les objets
dépendants sont notifiés et mis à jour
automatiquement

2
Fonctionnement
•  Est utilisé pour renvoyer un signal à des
modules qui jouent le rôle d’observateurs

•  En cas de notification, les observateurs


effectuent l’action adéquate en fonction des
informations qui parviennent depuis les
modules qu’ils observent

•  Le principe est que chaque classe


observable contient une liste d’observateurs,
ainsi à l’aide d’une méthode de notification,
l’ensemble des observateurs est prévenu
3
Diagramme UML

4
Participants
•  "Observable » ou Sujet est une classe qui représente l’objet
à observer, elle doit déclencher des évènements, on ajoute:
–  En attribut : une liste d'Observateurs
–  Une méthode permettant d'ajouter un Observateur dans la liste
–  Une méthode permettant d'envoyer un signal à tous ses
obsevateurs.

•  "Observateur" est une classe abstraite avec une méthode


actualiser, dont héritent des observateurs "concrets" qui
implémentent cette méthode.

•  Quand l'état de la classe change elle doit envoyer un signal a


tout ses observateurs qui doivent effectuer l'action nécessaire
en fonction du nouvel état de la classe.

5
Exemple: avertir quand une base
de donnée est modifiée
•  La classe observable est une base de
donnée
•  L’observateur peut être l’administrateur de
la base de données, le chef de l’entreprise
où la classe Archive (qui archive le journal
log de la base de données)

6
Exemple: l’interface observable

public interface Subject {


public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObservers();
}

7
L’interface Observateur
public interface Observer {
public void update(String operation, String
record);
}

8
Exemple la classe concrète du
sujet Observable
import [Link].*;

public class Database implements Subject {


private List<Observer> observers;

public Database() {
observers = new ArrayList<Observer>(); }

public void registerObserver(Observer o) {


[Link](o); }

public void removeObserver(Observer o) {


[Link](o); }

9
Ajouter la méthode qui déclenche
l’évènement
•  Dans notre exemple, on va la nommer editDB();
elle peut-t-être appelée (depuis une méthode
main()) comme suit:
•  [Link](« delete »,24);(db est un objet de la
classe Database)
•  Cette méthode aura 2 paramètres: l’opération et le
numéro de l’enregistrement à modifier
•  On doit donc rajouter deux attributs à la classe
Database: opération et numRecord pour capter les
deux paramètres de editDb(), afin de pouvoir les
transmettre à l’observateur via la méthode
notify(qu’on va implémenter plus loin)

10
Implémentation de la méthode
Déclencheur d’évènement
import [Link].*;

public class Database implements Subject {


private List<Observer> observers;

private String operation;


private int numRecord;
……………//les autres méthodes

public void editDb(String operation, int record)


{
[Link] = operation;
numRrecord = record;
notifyObservers();
}
}

11
Implémentation de la méthode
import [Link].*;
notify()
public class Database implements Subject {
private List<Observer> observers;

private String operation;


private int numRecord;
……………//les autres méthodes

public void notifyObservers() {


for (Observer obs:observers)
[Link](operation, record);
}}

public void editDb(String operation, int record)


{
[Link] = operation;
numRrecord = record;
notifyObservers();
}}
12
Implémenter les observateur
•  Comme mentionné au diapo 6, on peut
avoir plusieurs classes d’observateurs,
chacune doit implémenter l’interface
Observer

13
Un premier observateur
public class Archiver implements Observer {
public Archiver() {
}
public void update(String operation, String
record) {
[Link](“L’archiveur dit que
l’opérartion “ + operation + “ a été effectuée
sur l’enregistrement numéro “ + record);
}
}

14
Un deuxième observateur
public class Admin implements Observer {
public Admin() {
}
public void update(String operation, String
record) {
[Link](“L’admin dit que l’opérartion
“ + operation + “ a été effectuée sur
l’enregistrement numéro “ + record);
}
}

15
Un troisième observateur
public class Boss implements Observer {
public Boss() {
}
public void update(String operation, String
record) {
[Link](“Le directeur dit que
l’opérartion “ + operation + “ a été effectuée
sur l’enregistrement numéro “ + record);
}
}

16
Remarque
•  On peut simplifier l’exemple on n’implémentant qu’une seule classe
Observer concrête:
public class ObserverConcret implements Observer {
private String nomObs;
public ObserverConcret (String nomObs) {
[Link]=nomObs
}
public void update(String operation, String record) {
[Link](“Le “+nomObs+“ dit que l’opérartion “ + operation +
“ a été effectuée sur l’enregistrement numéro “ + record);
}}

Mais dans la réalité cela ne se passe pas aussi simplement; une


Classe Admin est en fait totalement différente d’une classe Archive
et d’une Classe Directeur

17
Tester les observateurs de la base
de données
public class TestObserver {
public static void main(String //attacher les observateurs au
args[]) { sujet Observable:
[Link](archiver);
//instancier de sujet [Link](client);
observable: [Link](boss);
Database db = new //déclencher un événement sur
Database(); le sujet(bdd) en supprimant
par exemple
//instancier des observateurs: l’enregistrement N°24:
Archiver archiver = new
Archiver(); [Link](“delete”, 24);
Client client = new Client(); }
Boss boss = new Boss(); }

18
Compilation et exécution
•  On aura sur la console les trois messages
suivant:
•  L’admin dit que l’opération delete a été
effectuée sur l’enregistrement numéro 24
•  L’archiveur dit que l’opération delete a été
effectuée sur l’enregistrement numéro 24
•  Le directeur dit que l’opération delete a été
effectuée sur l’enregistrement numéro 24

19
Le patron Observer intégré dans
Java
•  Java prend en charge nativement dans
plusieurs de ses API le patron Observer

•  Le cas le plus général est constitué d’une


interface Observer et d’une classe
Observable du package [Link].

•  Elles sont très similaires à nos interfaces,


mais elles apportent d’autres fonctionnalités
« toutes prêtes ».

20
La classe Observable et l’interface
Observer de l’api Java

21
Observer dans l’api Java
•  Observable est une CLASSE, non une interface.
Elle mémorise tous les observateurs et leurs
envoie des notifications à votre place

•  L’interface Observer est la même que dans notre


précédent diagramme de classes sauf que le nom
de la méthode actualiser() est devenu update().

•  Dans la classe ObservableConcret nous n’avons


plus besoin d’implémenter les méthode ajouter(),
supprimer() et notifier(), elles sont hérités de la
classe Observable

22
Deux Règles pour déclencher un
évènement
Si l’on utilise le patron observer de java,
l’objet observé doit suivre deux règles
1.  S’il est modifié, il doit appeler
setChanged()
2.  Quand il est prêt à notifier les
observateurs, il appelle notifyObservers()

23
Notre exemple avec le patron Observer de java
le sujet concret
Imports [Link];[Link] = operation;
public class Database numRrecord = record;
extends Observable { setChanged();
notifyObservers();
}
private String operation; public int getRecord() {
private int numRecord; return record; }
public String
getOperation() {
public void editDb(String return operation; }
operation, int record)
{ }
24
Notre exemple avec le patron Observer de java
le 1er Observateur
Imports [Link];

public class Archiver implements Observer {


public Archiver() {
}
public void update(Observer obs, Object record) {
[Link](“L’archiveur dit que l’opérartion “ +
((Database)obs).getOperation()

+ “ a été effectuée sur l’enregistrement numéro “ +


((Database)obs).getRecord());
}
}

25
Notre exemple avec le patron Observer de java
le 2eme Observateur
Imports [Link];

public class Admin implements Observer {


public Admin() {
}
public void update(Observer obs, Object record) {
[Link](“L’Admin dit que l’opérartion “ +
((Database)obs).getOperation()

+ “ a été effectuée sur l’enregistrement numéro “ +


((Database)obs).getRecord());
}
}

26
Notre exemple avec le patron Observer de java
le 3eme Observateur
Imports [Link];

public class Boss implements Observer {


public Boss() {
}
public void update(Observer obs, Object record) {
[Link](“Le directeur dit que l’opérartion “ +
((Database)obs).getOperation()

+ “ a été effectuée sur l’enregistrement numéro “ +


((Database)obs).getRecord());
}
}

27
Notre exemple avec le patron Observer de java
la classe Test
public class TestObserver { //attacher les observateurs au
public static void main(String sujet Observable, avec la
args[]) { méthode héritée
addObserver(o: Observer):
//instancier de sujet observable: [Link](archiver);
Database db = new Database(); db. addObserver(client);
db. addObserver(boss);
//instancier des observateurs: //déclencher un événement sur le
sujet(bdd) en supprimant par
Archiver archiver = new exemple l’enregistrement N°24:
Archiver();
Client client = new Client();
[Link](“delete”, 24);
Boss boss = new Boss(); }
}

28
Remarque
•  Un petit inconvénient du patron Observer
implémenté dans java:

–  Si notre classe SujetConcret hérite auparavant d’une


classe essentielle pour son fonctionnement, elle ne
peut pas étendre Observable de Java, car le multi
Héritage est interdit en Java

•  Donc, pour une application robuste et extensible, il


est préférable d’utiliser le patron Observer général
plutôt que celui implémenté dans java

29
Observer et les ActionListners de
java
•  Le composant Swing JButton est un sujet qui
hérite de la classe AbstractButton.

•  Si vous regardez la structure de cette classe


vous trouverez des méthodes comme add et
remove qui permettent d’ajouter et de
supprimer des observateurs qu’on appelle
dans la terminologie de Swing des listenners
(Auditeurs).
30
Observer et les ActionListners de
java
•  Ces listeners sont à l’écoute des différents types
d’événements qui peuvent se produire dans le
composant JButton.

•  Par exemple un ActionListener vous permet


d’écouter tous les types d’actions qui peuvent être
appliquées à un bouton, comme les clics.

•  Si l’un des événements se produit sur le bouton,


ce dernier notifie tous les observateurs qui sont de
type ActionListener en faisant appel à la méthode
actionPerformed() de chaque ActionListener.

31
Exemple avec ActionListner
import [Link]; Remarque
import [Link];
import [Link];
import [Link];
•  Les diapos du 23 à 31 du présent cours ne
import [Link];
import [Link];

concernent
public class pas
SimpleSwingExample { la promo 2019
public static void main(String[] args) { Enregistrement
JFrame frame = new JFrame("Frame Title"); du bouton avec
final JTextArea comp = new JTextArea(); les
JButton btn = new JButton("click"); observateurs(List
[Link]().add(comp, [Link]); eners)
[Link]().add(btn, [Link]);

[Link](new ActionListener() {
public void actionPerformed(ActionEvent ae) {
[Link]("Button has been clicked");
}
});

int width = 300;


int height = 300;
[Link](width, height);

[Link](true);
} 32
}

Vous aimerez peut-être aussi