Denne oppgaven handler om å bruke observatør-observert-teknikken for å bli informert om hendelser for stoppeklokker.

Observatør-observert-teknikken går ut på at det observerte objektet sier fra til en eller flere observatører om at tilstanden er endret. I denne oppgaven skal vi utvide StopWatch og StopWatchManager fra den tidligere StopWatch-oppgaven. StopWatch skal kunne si fra til observatører av typen StopWatchListener når stoppeklokkens tilstand endres. StopWatchManager skal kunne si fra til observatører (også av typen StopWatchListener) når en av dens stoppeklokker endrer tilstand.

Leseliste

Observatør-observert-teknikkenDet er ofte behov for å sikre at et objekt er konsistent med et annet, f.eks. at det som vises i et brukergrensesnittelement stemmer overens med tilstanden til de underliggende objektene i systemet. En god måte å gjøre det på er å bruke observatør-observert-teknikken.

Del 1: StopWatch

Du skal definere et lyttergrensesnitt, StopWatchListener, som skal inneholde:

  • void stopWatchChanged(StopWatch stopWatch, int what) - lyttermetode for holde lyttere oppdaterte på tilstanden til stoppeklokken. stopWatch er hvilket StopWatch-objekt som er blitt endret, og what et heltall som identifiserer hvilken endring som har skjedd.

Tallene som identifiserer endringshendelser er som følgende:

  • 1 - stoppeklokken har mottatt tick
  • 2 - stoppeklokken har blitt startet
  • 4 - stoppeklokken har startet en ny rundetid
  • 8 - stoppeklokken har stoppet

Det kan være lurt å definere disse som konstanter i grensesnittet, så andre som skal bruke grensesnittet ikke trenger å vite hvilket tall som tilhører en hendelse.

For at observatører skal kunne holde seg oppdatert på StopWatch-objekter må StopWatch-klassen utvides med metoder som kan legge til og fjerne observatører. Implementer følgende metoder i StopWatch:

  • void addStopWatchListener(StopWatchListener listener) - metode for legge til ny en observatør
  • void removeStopWatchListener(StopWatchListener listener) - metode for fjerne en observatør

Lyttermetoden må kalles på alle registrerte observatører når tilstanden til stoppeklokken endres, slik at alle observatører holdes oppdatert.

Testkode for denne oppgaven finner du her: patterns/observable/StopWatchTest.javaOriginalkoden (jextest) finner du her: patterns/observable/StopWatch.jextest.

Del 2: StopWatchManager

Det skal også være mulig å lytte på StopWatchManager og bli holdt oppdatert om alle stoppeklokker som et StopWatchManager-objekt holder styr på. For å oppnå dette må også StopWatchManager ha metoder for å legge til og fjerne observatører. Implementer følgende i StopWatchManager:

  • void addStopWatchListener(StopWatchListener listener) - metode for legge til ny en observatør
  • void removeStopWatchListener(StopWatchListener listener) - metode for fjerne en observatør

Lyttermetoden må kalles på alle registrerte observatører når tilstanden til en av stoppeklokkene endres, slik at alle observatører holdes oppdatert.

Testkode for denne oppgaven finner du her: patterns/observable/StopWatchManagerTest.javaOriginalkoden (jextestfinner du her: patterns/observable/StopWatchManager.jextest.

 

  • No labels