SlideShare une entreprise Scribd logo
1  sur  19
Exercice: Chrono
par le patron Observer
Présenté par:
Hibatallah AOUADNI
Plan
Rappel
Principe
Conception
Implémentation et test
2
Rappel
Patron… Strategy …. Observer
C’est un modèle qui facilite la conception d'un logiciel. Il décrit une
solution standard, utilisable dans la conception de différents logiciels
Règle 4: Opter pour une conception faiblement couplée entre les objets
qui interagissent
Règle 1: Identifier les aspects variables de mon application et les
séparer de ce qui reste invariant
Règle 2 : Programmer des interfaces, et non des implémentations
Règle 3: Favoriser la composition sur l’héritage
Rappel
C’est quoi un patron de conception?
C’est quoi le patron « Strategy »?
C’est quoi le patron « Observer»?
4
Principe
Sujet et Observer
Principe
Subject
Observer 1
Observer 2 Observer 3
Observer 4
Observer 1
Observer 2
Observer 4
6
Subject
Principe
7
// les attributs de sujet
tab: Vector<Observer>
// getters & setters
addObserver(Observer o)
removeObserver(Observer o)
notifyObserver()
//méthode changement d’état
//invoque notifyObserver
Observer
// les attributs celle
même //de sujet
// getters & setters
//constructeur
Observer (Subject s)
//méthode update
Update (param, …..)
//les paramètres sont les
//attributs de sujet
Conception
Diagramme de classe
Implémentation
Implémentation et test
Implémentation Subject
10
ChronoSubject | AbstractChrono | Chrono
public interface ChronoSubject {
public void registreObserver(Object o);
public void removeObserver(Object o);
public void notifyObserver();
public void tick(int secondes, int minutes, int heures);
}
Implémentation Subject
11
ChronoSubject | AbstractChrono | Chrono
public abstract class AbstractChrono implements ChronoSubject{
protected int secondes;
protected int minutes;
protected int heures;
public abstract void tick(int secondes, int minutes, int heures);
}
private
private
private
Implémentation Subject
12
ChronoSubject | AbstractChrono | Chrono
public class Chrono extends AbstractChrono{
private Vector<Object> tabObservers;
public Chrono() {
super.secondes = 0;
super.minutes = 0;
super.heures = 0;
tabObservers = new Vector<Object>();
}
……………
……………
public int getSecondes() {
return super.secondes;
}
public int getMinutes() {
return super.minutes;
}
public int getHeures() {
return super.heures;
}
……………
Les attributs sont définis
dans la classe mère
(protected)
……………
public void registreObserver(Object o){
tabObservers.add(o);
}
public void removeObserver(Object o){
for(int i=0;i<tabObservers.size();i++){
if(tabObservers.get(i).equals(o)){
tabObservers.remove(i);
}
}
}
……………
……………
public void notifyObserver(){
for(int i=0;i<tabObservers.size();i++){
if(tabObservers.get(i) instanceof DisplayElement){
((DisplayElement)tabObservers.get(i)).update(secondes,minutes,h
eures);
}
if(tabObservers.get(i) instanceof DisplaySonnerie){
((DisplaySonnerie)tabObservers.get(i)).update(secondes,minutes,h
eures);
}
}
}
……………
……………
@Override
public void tick(int secondes, int minutes, int heures) {
this.secondes = secondes;
this.minutes = minutes;
this.heures = heures;
notifyObserver();
}
}
Implémentation Observer
13
DisplayObserver | DisplayAiguille | DisplayNumerique
public interface DisplayObserver {
public void update(int secondes, int minutes, int heures);
public void afficheTempsEcoule();
}
Implémentation Observer
14
DisplayObserver | DisplayAiguille | DisplayNumerique
public class DisplayAiguille implements DisplayObserver{
private int secondes;
private int minutes;
private int heures;
public DisplayAiguille(Chrono c) {
secondes = c.getSecondes();
minutes = c.getMinutes();
heures = c.getHeures();
}
……………
…………
@Override
public void afficheTempsEcoule() {
System.out.println("c'est "+heures+" heures et "+minutes+"
minutes et "+secondes+" secondes.");
}
@Override
public void update(int secondes, int minutes, int heures) {
this.secondes = secondes;
this.minutes = minutes;
this.heures = heures;
}
}
Implémentation Observer
15
DisplayObserver | DisplayAiguille | DisplayNumerique
public class DisplayNumerique implements DisplayObserver{
private int secondes;
private int minutes;
private int heures;
public DisplayNumerique(Chrono c) {
secondes = c.getSecondes();
minutes = c.getMinutes();
heures = c.getHeures();
}
……………..
……………
@Override
public void afficheTempsEcoule() {
NumberFormat formatter = new DecimalFormat("00");
String h,m,s;
s = formatter.format(secondes);
m = formatter.format(minutes);
h = formatter.format(heures);
System.out.println("c'est "+h+":"+m+":"+s);
}
……………..
……………
@Override
public void update(int secondes, int minutes, int heures) {
this.secondes = secondes;
this.minutes = minutes;
this.heures = heures;
}
}
Implémentation Observer
16
SonnerieObserver | Sonnerie1| Sonnerie2
public interface Sonnerie Observer{
public void update(int secondes, int minutes, int heures);
public void ding();
}
Implémentation Observer
17
SonnerieObserver | Sonnerie1| Sonnerie2
public class Sonnerie1 implements SonnerieObserver{
private int secondes;
private int minutes;
private int heures;
public Sonnerie1(Chrono c) {
secondes = c.getSecondes();
minutes = c.getMinutes();
heures = c.getHeures();
}
……………
……………..
@Override
public void ding() {
if(minutes == 0 && secondes == 0){
System.out.println("coco coco coco ... l'heure est
"+heures+":00");
}
}
@Override
public void update(int secondes, int minutes, int heures) {
this.secondes = secondes;
this.minutes = minutes;
this.heures = heures;
}
}
Implémentation Observer
18
SonnerieObserver | Sonnerie1| Sonnerie2
public class Sonnerie2 implements SonnerieObserver{
private int secondes;
private int minutes;
private int heures;
public Sonnerie2(Chrono c) {
secondes = c.getSecondes();
minutes = c.getMinutes();
heures = c.getHeures();
}
………………
…………….
@Override
public void ding() {
if(minutes == 0 && secondes == 0){
System.out.println("ding dong ding ... c'est "+heures+"
heure");
}
}
@Override
public void update(int secondes, int minutes, int heures) {
this.secondes = secondes;
this.minutes = minutes;
this.heures = heures;
}
}
Test
19
public class TestChrono
{
public static void main(String[] args)
{
Chrono c =new Chrono();
DisplaySonnerie s1 = new Sonnerie1(c);
DisplaySonnerie s2 = new Sonnerie2(c);
DisplayElement d1 = new DisplayAiguille(c);
DisplayElement d2 = new DisplayNumerique(c);
c.registreObserver(s1);
c.registreObserver(s2);
c.registreObserver(d1);
c.registreObserver(d2);
……………….
……………..
for (int i=3590;i<5000;i++){
try{
Thread.sleep(1000);
}catch(InterruptedException e)
{
System.out.print("erreur");
}
c.tick((i%3600)%60, (int)((i%3600)/60), (int)(i/3600));
s1.ding();
s2.ding();
d1.afficheTempsEcoule();
d2.afficheTempsEcoule();
}
}
Affichage (console):
c'est 0 heures et 59 minutes et 57 secondes.
c'est 00:59:57
c'est 0 heures et 59 minutes et 58 secondes.
c'est 00:59:58
c'est 0 heures et 59 minutes et 59 secondes.
c'est 00:59:59
coco coco coco ... l'heure est 1:00
ding dong ding ... c'est 1 heure
c'est 1 heures et 0 minutes et 0 secondes.
c'est 01:00:00
c'est 1 heures et 0 minutes et 1 secondes.
c'est 01:00:01

Contenu connexe

Tendances

Les règles de passage
Les règles de passageLes règles de passage
Les règles de passagemarwa baich
 
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...ENSET, Université Hassan II Casablanca
 
Introduction aux architectures des SI
Introduction aux architectures des SI Introduction aux architectures des SI
Introduction aux architectures des SI Heithem Abbes
 
Chp1 - Introduction aux méthodologies de Conception
Chp1 - Introduction aux méthodologies de ConceptionChp1 - Introduction aux méthodologies de Conception
Chp1 - Introduction aux méthodologies de ConceptionLilia Sfaxi
 
Introduction aux systèmes répartis
Introduction aux systèmes répartisIntroduction aux systèmes répartis
Introduction aux systèmes répartisHeithem Abbes
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyENSET, Université Hassan II Casablanca
 
Tp1 - WS avec JAXWS
Tp1 - WS avec JAXWSTp1 - WS avec JAXWS
Tp1 - WS avec JAXWSLilia Sfaxi
 
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiJava entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiENSET, Université Hassan II Casablanca
 
Rapport application web (Spring BOOT,angular4) et mobile(ionc3) gestion des a...
Rapport application web (Spring BOOT,angular4) et mobile(ionc3) gestion des a...Rapport application web (Spring BOOT,angular4) et mobile(ionc3) gestion des a...
Rapport application web (Spring BOOT,angular4) et mobile(ionc3) gestion des a...MOHAMMED MOURADI
 
Cours des bases de données
Cours des bases de données Cours des bases de données
Cours des bases de données yassine kchiri
 
diagramme de séquence UML
diagramme de séquence UMLdiagramme de séquence UML
diagramme de séquence UMLAmir Souissi
 
Architectures orientés services (SOA)
Architectures orientés services (SOA)Architectures orientés services (SOA)
Architectures orientés services (SOA)Heithem Abbes
 
gestion de magasin vente matériels informatique
gestion de magasin vente matériels informatiquegestion de magasin vente matériels informatique
gestion de magasin vente matériels informatiqueOussama Yoshiki
 
Rapport exposé eXtreme Programming XP
Rapport exposé eXtreme Programming XPRapport exposé eXtreme Programming XP
Rapport exposé eXtreme Programming XPSarah
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...ENSET, Université Hassan II Casablanca
 

Tendances (20)

Les règles de passage
Les règles de passageLes règles de passage
Les règles de passage
 
Cours design pattern m youssfi partie 5 adapter
Cours design pattern m youssfi partie 5 adapterCours design pattern m youssfi partie 5 adapter
Cours design pattern m youssfi partie 5 adapter
 
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
 
Introduction aux architectures des SI
Introduction aux architectures des SI Introduction aux architectures des SI
Introduction aux architectures des SI
 
Chp1 - Introduction aux méthodologies de Conception
Chp1 - Introduction aux méthodologies de ConceptionChp1 - Introduction aux méthodologies de Conception
Chp1 - Introduction aux méthodologies de Conception
 
Introduction aux systèmes répartis
Introduction aux systèmes répartisIntroduction aux systèmes répartis
Introduction aux systèmes répartis
 
Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategy
 
Tp1 - WS avec JAXWS
Tp1 - WS avec JAXWSTp1 - WS avec JAXWS
Tp1 - WS avec JAXWS
 
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiJava entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 
Rapport application web (Spring BOOT,angular4) et mobile(ionc3) gestion des a...
Rapport application web (Spring BOOT,angular4) et mobile(ionc3) gestion des a...Rapport application web (Spring BOOT,angular4) et mobile(ionc3) gestion des a...
Rapport application web (Spring BOOT,angular4) et mobile(ionc3) gestion des a...
 
Cours des bases de données
Cours des bases de données Cours des bases de données
Cours des bases de données
 
diagramme de séquence UML
diagramme de séquence UMLdiagramme de séquence UML
diagramme de séquence UML
 
Architectures orientés services (SOA)
Architectures orientés services (SOA)Architectures orientés services (SOA)
Architectures orientés services (SOA)
 
gestion de magasin vente matériels informatique
gestion de magasin vente matériels informatiquegestion de magasin vente matériels informatique
gestion de magasin vente matériels informatique
 
Modèle en cascade
Modèle en cascadeModèle en cascade
Modèle en cascade
 
Rapport exposé eXtreme Programming XP
Rapport exposé eXtreme Programming XPRapport exposé eXtreme Programming XP
Rapport exposé eXtreme Programming XP
 
Introduction à Symfony
Introduction à SymfonyIntroduction à Symfony
Introduction à Symfony
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
 

Similaire à Patron observer

Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1Laurent BUNIET
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationECAM Brussels Engineering School
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introductionneuros
 
Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Farouk Mezghich
 
In01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancéesIn01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancéesYann Caron
 
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosSaid Benaissa
 
Programmation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancéesProgrammation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancéesYann Caron
 
Sec day cuckoo_workshop
Sec day cuckoo_workshopSec day cuckoo_workshop
Sec day cuckoo_workshopThomas Roccia
 
L’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacketL’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacketStéphane Legrand
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
De l'interactivité avec les Listeners
De l'interactivité avec les ListenersDe l'interactivité avec les Listeners
De l'interactivité avec les ListenersJean-Baptiste Yunès
 
Introduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsIntroduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsAurélien Regat-Barrel
 
Android Lab Test : Le capteur gyroscope (français)
Android Lab Test : Le capteur gyroscope (français)Android Lab Test : Le capteur gyroscope (français)
Android Lab Test : Le capteur gyroscope (français)Bruno Delb
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++cppfrug
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniterAtsé François-Xavier KOBON
 
Solutions Linux 2008 - JavaScript
Solutions Linux 2008 - JavaScriptSolutions Linux 2008 - JavaScript
Solutions Linux 2008 - JavaScriptRaphaël Semeteys
 
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronesAsyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronestchappui
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Engineor
 

Similaire à Patron observer (20)

Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
 
Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)
 
In01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancéesIn01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancées
 
Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17
 
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
 
Programmation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancéesProgrammation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancées
 
Sec day cuckoo_workshop
Sec day cuckoo_workshopSec day cuckoo_workshop
Sec day cuckoo_workshop
 
L’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacketL’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacket
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
De l'interactivité avec les Listeners
De l'interactivité avec les ListenersDe l'interactivité avec les Listeners
De l'interactivité avec les Listeners
 
Introduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsIntroduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomics
 
Android Lab Test : Le capteur gyroscope (français)
Android Lab Test : Le capteur gyroscope (français)Android Lab Test : Le capteur gyroscope (français)
Android Lab Test : Le capteur gyroscope (français)
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
 
Solutions Linux 2008 - JavaScript
Solutions Linux 2008 - JavaScriptSolutions Linux 2008 - JavaScript
Solutions Linux 2008 - JavaScript
 
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronesAsyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
 
Boot
BootBoot
Boot
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !
 

Plus de Hibatallah Aouadni

Plus de Hibatallah Aouadni (7)

Réseaux mobiles
Réseaux mobiles Réseaux mobiles
Réseaux mobiles
 
Relation de dépendance immédiate
Relation de dépendance immédiateRelation de dépendance immédiate
Relation de dépendance immédiate
 
Factory method
Factory method Factory method
Factory method
 
KeyWatch
KeyWatchKeyWatch
KeyWatch
 
Exposé 1
Exposé   1Exposé   1
Exposé 1
 
BonitaSoft, la solution BPM
BonitaSoft, la solution BPMBonitaSoft, la solution BPM
BonitaSoft, la solution BPM
 
Mobile cloud computing
Mobile cloud computingMobile cloud computing
Mobile cloud computing
 

Patron observer

  • 1. Exercice: Chrono par le patron Observer Présenté par: Hibatallah AOUADNI
  • 4. C’est un modèle qui facilite la conception d'un logiciel. Il décrit une solution standard, utilisable dans la conception de différents logiciels Règle 4: Opter pour une conception faiblement couplée entre les objets qui interagissent Règle 1: Identifier les aspects variables de mon application et les séparer de ce qui reste invariant Règle 2 : Programmer des interfaces, et non des implémentations Règle 3: Favoriser la composition sur l’héritage Rappel C’est quoi un patron de conception? C’est quoi le patron « Strategy »? C’est quoi le patron « Observer»? 4
  • 6. Principe Subject Observer 1 Observer 2 Observer 3 Observer 4 Observer 1 Observer 2 Observer 4 6
  • 7. Subject Principe 7 // les attributs de sujet tab: Vector<Observer> // getters & setters addObserver(Observer o) removeObserver(Observer o) notifyObserver() //méthode changement d’état //invoque notifyObserver Observer // les attributs celle même //de sujet // getters & setters //constructeur Observer (Subject s) //méthode update Update (param, …..) //les paramètres sont les //attributs de sujet
  • 10. Implémentation Subject 10 ChronoSubject | AbstractChrono | Chrono public interface ChronoSubject { public void registreObserver(Object o); public void removeObserver(Object o); public void notifyObserver(); public void tick(int secondes, int minutes, int heures); }
  • 11. Implémentation Subject 11 ChronoSubject | AbstractChrono | Chrono public abstract class AbstractChrono implements ChronoSubject{ protected int secondes; protected int minutes; protected int heures; public abstract void tick(int secondes, int minutes, int heures); } private private private
  • 12. Implémentation Subject 12 ChronoSubject | AbstractChrono | Chrono public class Chrono extends AbstractChrono{ private Vector<Object> tabObservers; public Chrono() { super.secondes = 0; super.minutes = 0; super.heures = 0; tabObservers = new Vector<Object>(); } …………… …………… public int getSecondes() { return super.secondes; } public int getMinutes() { return super.minutes; } public int getHeures() { return super.heures; } …………… Les attributs sont définis dans la classe mère (protected) …………… public void registreObserver(Object o){ tabObservers.add(o); } public void removeObserver(Object o){ for(int i=0;i<tabObservers.size();i++){ if(tabObservers.get(i).equals(o)){ tabObservers.remove(i); } } } …………… …………… public void notifyObserver(){ for(int i=0;i<tabObservers.size();i++){ if(tabObservers.get(i) instanceof DisplayElement){ ((DisplayElement)tabObservers.get(i)).update(secondes,minutes,h eures); } if(tabObservers.get(i) instanceof DisplaySonnerie){ ((DisplaySonnerie)tabObservers.get(i)).update(secondes,minutes,h eures); } } } …………… …………… @Override public void tick(int secondes, int minutes, int heures) { this.secondes = secondes; this.minutes = minutes; this.heures = heures; notifyObserver(); } }
  • 13. Implémentation Observer 13 DisplayObserver | DisplayAiguille | DisplayNumerique public interface DisplayObserver { public void update(int secondes, int minutes, int heures); public void afficheTempsEcoule(); }
  • 14. Implémentation Observer 14 DisplayObserver | DisplayAiguille | DisplayNumerique public class DisplayAiguille implements DisplayObserver{ private int secondes; private int minutes; private int heures; public DisplayAiguille(Chrono c) { secondes = c.getSecondes(); minutes = c.getMinutes(); heures = c.getHeures(); } …………… ………… @Override public void afficheTempsEcoule() { System.out.println("c'est "+heures+" heures et "+minutes+" minutes et "+secondes+" secondes."); } @Override public void update(int secondes, int minutes, int heures) { this.secondes = secondes; this.minutes = minutes; this.heures = heures; } }
  • 15. Implémentation Observer 15 DisplayObserver | DisplayAiguille | DisplayNumerique public class DisplayNumerique implements DisplayObserver{ private int secondes; private int minutes; private int heures; public DisplayNumerique(Chrono c) { secondes = c.getSecondes(); minutes = c.getMinutes(); heures = c.getHeures(); } …………….. …………… @Override public void afficheTempsEcoule() { NumberFormat formatter = new DecimalFormat("00"); String h,m,s; s = formatter.format(secondes); m = formatter.format(minutes); h = formatter.format(heures); System.out.println("c'est "+h+":"+m+":"+s); } …………….. …………… @Override public void update(int secondes, int minutes, int heures) { this.secondes = secondes; this.minutes = minutes; this.heures = heures; } }
  • 16. Implémentation Observer 16 SonnerieObserver | Sonnerie1| Sonnerie2 public interface Sonnerie Observer{ public void update(int secondes, int minutes, int heures); public void ding(); }
  • 17. Implémentation Observer 17 SonnerieObserver | Sonnerie1| Sonnerie2 public class Sonnerie1 implements SonnerieObserver{ private int secondes; private int minutes; private int heures; public Sonnerie1(Chrono c) { secondes = c.getSecondes(); minutes = c.getMinutes(); heures = c.getHeures(); } …………… …………….. @Override public void ding() { if(minutes == 0 && secondes == 0){ System.out.println("coco coco coco ... l'heure est "+heures+":00"); } } @Override public void update(int secondes, int minutes, int heures) { this.secondes = secondes; this.minutes = minutes; this.heures = heures; } }
  • 18. Implémentation Observer 18 SonnerieObserver | Sonnerie1| Sonnerie2 public class Sonnerie2 implements SonnerieObserver{ private int secondes; private int minutes; private int heures; public Sonnerie2(Chrono c) { secondes = c.getSecondes(); minutes = c.getMinutes(); heures = c.getHeures(); } ……………… ……………. @Override public void ding() { if(minutes == 0 && secondes == 0){ System.out.println("ding dong ding ... c'est "+heures+" heure"); } } @Override public void update(int secondes, int minutes, int heures) { this.secondes = secondes; this.minutes = minutes; this.heures = heures; } }
  • 19. Test 19 public class TestChrono { public static void main(String[] args) { Chrono c =new Chrono(); DisplaySonnerie s1 = new Sonnerie1(c); DisplaySonnerie s2 = new Sonnerie2(c); DisplayElement d1 = new DisplayAiguille(c); DisplayElement d2 = new DisplayNumerique(c); c.registreObserver(s1); c.registreObserver(s2); c.registreObserver(d1); c.registreObserver(d2); ………………. …………….. for (int i=3590;i<5000;i++){ try{ Thread.sleep(1000); }catch(InterruptedException e) { System.out.print("erreur"); } c.tick((i%3600)%60, (int)((i%3600)/60), (int)(i/3600)); s1.ding(); s2.ding(); d1.afficheTempsEcoule(); d2.afficheTempsEcoule(); } } Affichage (console): c'est 0 heures et 59 minutes et 57 secondes. c'est 00:59:57 c'est 0 heures et 59 minutes et 58 secondes. c'est 00:59:58 c'est 0 heures et 59 minutes et 59 secondes. c'est 00:59:59 coco coco coco ... l'heure est 1:00 ding dong ding ... c'est 1 heure c'est 1 heures et 0 minutes et 0 secondes. c'est 01:00:00 c'est 1 heures et 0 minutes et 1 secondes. c'est 01:00:01

Notes de l'éditeur

  1. Avant de commencer la correction d’exercice, on va faire un rappel sur les patrons qu’on a étudié, puis, on passe à expliquer brièvement le principe de patron utilisé « Observer », ensuite on va faire la conception de notre exercice pour obtenir une implémentation sans erreurs.
  2. Pour rappeler tout ce qu’on a étudier, il faut répondre aux ces questions: c’est un modèle qui nous permet de concevoir notre application selon un standard générique d'implémentation pour le patron strategy, on a étudié 3 règles qui nous guident à utiliser ce patron pour concevoir notre app et pour le patron observer, on a ajouté une 4éme règle spécifique pour ce dernier qui consiste à ….
  3. Pour que chaque observateur veut recevoir les nouveautés de Sujet, il doit être tt d’abords inscris, c’est-à-dire : l’observateur va demander du sujet d’être inscrit c’est-à-dire l’objet sujet va être passé comme étant un paramètre dans la constructeur de l’observateur le sujet va enregistré l’observateur dans la liste des inscrits et ainsi de suite Alors si un obervateur ne demande pas d’être inscrit alors, il na vas pas être informé par le sujet à propos les nouveautés.
  4. Mais à tt moment, on peut ajouter des autres observateurs et aussi on peut supprimer des observateurs, cela nous guide à constater que
  5. D’aprés l’énoncé, on va schématiser notre diagramme de classe, on va le dessiner ensemble sur le tableau
  6. Private to protected pour que Chrono puisse accéder aux attributs