19
Exercice: Chrono par le patron Observer Présenté par: Hibatallah AOUADNI

Patron observer

Embed Size (px)

Citation preview

Page 1: Patron observer

Exercice: Chronopar le patron Observer

Présenté par:Hibatallah AOUADNI

Page 2: Patron observer

2

Plan

Rappel

Principe

Conception

Implémentation et test

Page 3: Patron observer

Rappel

Patron… Strategy …. Observer

Page 4: Patron 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»?

Page 5: Patron observer

Principe

Sujet et Observer

Page 6: Patron observer

6

Principe

Subject

Observer 1

Observer 2 Observer 3

Observer 4

Observer 1Observer 2Observer 4

Page 7: Patron observer

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

Page 8: Patron observer

Conception

Diagramme de classe

Page 9: Patron observer

Implémentation

Implémentation et test

Page 10: Patron observer

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);

}

Page 11: Patron observer

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

Page 12: Patron observer

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();

}

}

Page 13: Patron observer

13

Implémentation ObserverDisplayObserver | DisplayAiguille | DisplayNumerique

public interface DisplayObserver {

public void update(int secondes, int minutes, int heures);public void afficheTempsEcoule();

}

Page 14: Patron observer

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;

}}

Page 15: Patron observer

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;

}

}

Page 16: Patron observer

16

Implémentation ObserverSonnerieObserver | Sonnerie1| Sonnerie2

public interface Sonnerie Observer{

public void update(int secondes, int minutes, int heures);public void ding();

}

Page 17: Patron observer

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;

}}

Page 18: Patron observer

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;

}}

Page 19: Patron observer

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