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

Compare with Current View Page History

« Previous Version 4 Next »

Det 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.

Et observerbart objekt er et objekt som

  • har intern tilstand som kan lese og endres vha. tilgangsmetoder, f.eks. getter- og setter-metoder
  • lar andre objekter registrere seg som interessert i (endringer i) tilstanden og
  • sier fra til de registrerte objektene om endringer

Det første punktet er typisk for data- eller tilstandsorienterte objekter som er riktig innkapslet. De to andre punktene gjør det mulig for andre objekter å reagere på endringer og holde sin egen tilstand konsistent, som er formålet med observatør-observert-teknikken. Som navnet indikerer, så dreier denne teknikken seg om en kobling mellom to objekter: det ene objektet, observatøren, observerer den andre, den observerte. En sier gjerne at observatør og observert er to roller i et objekt-samspill. For at samspillet skal fungere, så må hvert objekt oppføre seg iht. reglene for samspillet.

Observert-rollenObservatør-rollen

Det observerte objektet må være observerbart, dvs. ha metoder for å

  • registrere observatører
  • endre tilstanden sin
  • si fra til observatørene om endringene

Observatøren må ha metoder for å

  • ta imot beskjed om tilstandsendringene i objektene det observerer

Akkurat når og hvordan observatøren blir registrert hos det observerte objektet er ikke gitt, det vesentlige er hva som skjer etterpå: at observatøren får beskjed om tilstandsendringer. 

For å gjøre teknikken konkret, så tenker vi oss at et vintersportssted, f.eks. Oppdal, tilbyr seg å sende ut varsel om større mengder nysnø, såkalt pudderalarm, slik at skientusiastiske studenter (og faglærere) vet når de skal prioritere løssnøkjøring fremfor forelesninger. Her fungerer vintersportsstedet som observert og skientusiasten som observatør. For å implementere dette definerer vi derfor klassene Vintersportssted og Person. I tillegg, og dette er viktig, så defineres grensesnittet Pudderalarmlytter, som fanger opp det å være interessert i pudderalarm. Dette gjør koblingen mellom Vintersportssted og Person litt løsere og åpner for at andre klasser, f.eks. Rutebilselskap også kan vise sin interesse for pudderalarm og sette opp ekstrabusser til det aktuelle vintersportsstedet.

Pudderalarmlyttervoid pudderalarm(Vintersportssted)Vintersportsstedvoid addPudderalarmlytter(Pudderalarmlytter)void removePudderalarmlytter(Pudderalarmlytter)void firePudderalarm()*PersonRutebilselskappudderalarmlyttere  

 

Iht. observert-rollen må Vintersportssted har metoder for å registrere

 

For at klassen for det observerte objektet ikke skal være bundet til en spesifikk observatør, så defineres gjerne et grensesnitt som observatørene må implementere.

 

Registrering og oppdatering er en del av

 

  • No labels