You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »

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 en tidligere StopWatch-oppgave. 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.

Les mer om 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.

JExercise-testkode for denne oppgaven finner du her: patterns/observable/StopWatchTest.javaJextest-koden 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.


 JExercise-testkode for denne oppgaven finner du her: patterns/observable/StopWatchManagerTest.java Jextest-koden finner du her: patterns/observable/StopWatchManager.jextest.

 


JExercise lar deg sjekke din egen kode vha. forhåndslagde JUnit-tester og JExercise-panelet

Bruk av JExercise:

  1. Sørg for at jexercise-standalone.jar er lagt til i ditt prosjekts Build Path. Dette må gjøres hver gang du oppretter et nytt prosjekt, og det er derfor lurt å gjenbruke samme prosjekt til alle oppgaver.
  2. JExercise-tillegget må være installert. Installer tillegget fra følgende oppdateringsadresse: http://folk.ntnu.no/hal/dev/updatesite.
  3. Åpne JExercise-panelet via Window -> Show View -> Other, og navigere deg fram til JExercise i vinduet som kommer opp, velge det og klikke OK.
  4. Klikke og dra oppgavens testklasse, <oppgavenavn>Test.java fra pakkeoversikten og slippe den i JExercise panelet. 
  5. Testene kan så kjøres ved å dobbeltklikke på testen som ønskes kjørt.

Ved trøbbel, se først om du finner løsningen i Løsninger på trøbbel med JExercise.

Unknown macro: {html}

Twitre gjerne om oppgaven når du er ferdig: <a href="https://twitter.com/share" class="twitter-share-button" data-hashtags="jexercise">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>

  • No labels