Exercice: Chronopar le patron Observer
Présenté par:Hibatallah AOUADNI
2
Plan
Rappel
Principe
Conception
Implémentation et test
Rappel
Patron… Strategy …. Observer
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 logicielsRè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»?
Principe
Sujet et Observer
6
Principe
Subject
Observer 1
Observer 2 Observer 3
Observer 4
Observer 1Observer 2Observer 4
7
Subject
Principe
// les attributs de sujettab: Vector<Observer> // getters & settersaddObserver(Observer o)removeObserver(Observer o)notifyObserver()//méthode changement d’état //invoque notifyObserver
Observer
// les attributs celle même //de sujet
// getters & setters//constructeurObserver (Subject s)//méthode updateUpdate (param, …..)//les paramètres sont les //attributs de sujet
Conception
Diagramme de classe
Implémentation
Implémentation et test
10
Implémentation SubjectChronoSubject | 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 SubjectChronoSubject | 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);
}
privateprivate private
12
Implémentation SubjectChronoSubject | 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,heures);}if(tabObservers.get(i) instanceof DisplaySonnerie){((DisplaySonnerie)tabObservers.get(i)).update(secondes,minutes,heures);}}
} ……………
……………
@Overridepublic void tick(int secondes, int minutes, int heures) {
this.secondes = secondes;this.minutes = minutes;this.heures = heures;notifyObserver();
}
}
13
Implémentation ObserverDisplayObserver | DisplayAiguille | DisplayNumerique
public interface DisplayObserver {
public void update(int secondes, int minutes, int heures);public void afficheTempsEcoule();
}
14
Implémentation ObserverDisplayObserver | 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();
}……………
…………@Overridepublic void afficheTempsEcoule() {
System.out.println("c'est "+heures+" heures et "+minutes+" minutes et "+secondes+" secondes.");
}
@Overridepublic void update(int secondes, int minutes, int heures) {
this.secondes = secondes;this.minutes = minutes;this.heures = heures;
}}
15
Implémentation ObserverDisplayObserver | 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();
}……………..
……………
@Overridepublic 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);
}……………..
……………
@Overridepublic void update(int secondes, int minutes, int heures) {
this.secondes = secondes;this.minutes = minutes;this.heures = heures;
}
}
16
Implémentation ObserverSonnerieObserver | Sonnerie1| Sonnerie2
public interface Sonnerie Observer{
public void update(int secondes, int minutes, int heures);public void ding();
}
17
Implémentation ObserverSonnerieObserver | 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();}
……………
……………..@Overridepublic void ding() {
if(minutes == 0 && secondes == 0){System.out.println("coco coco coco ... l'heure
est "+heures+":00");}
}@Overridepublic void update(int secondes, int minutes, int heures) {
this.secondes = secondes;this.minutes = minutes;this.heures = heures;
}}
18
Implémentation ObserverSonnerieObserver | 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();
}………………
…………….@Overridepublic void ding() {
if(minutes == 0 && secondes == 0){System.out.println("ding dong ding ... c'est
"+heures+" heure");}
}@Overridepublic void update(int secondes, int minutes, int heures) {
this.secondes = secondes;this.minutes = minutes;this.heures = heures;
}}
19
Test
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:57c'est 0 heures et 59 minutes et 58 secondes.c'est 00:59:58c'est 0 heures et 59 minutes et 59 secondes.c'est 00:59:59
coco coco coco ... l'heure est 1:00ding dong ding ... c'est 1 heurec'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