Observer Pattern

Observer Pattern

Sat 26 June 2010

Dette er et mønster hvor vi lar et eller flere objekter (observer) følge med på et annet objekt (subjekt). Det er subjektets oppgave å holde rede på hvem som observerer, og oppdatere disse når det skjer endringer. Observer pattern kan utvides til MCV (Model-View-Controller) pattern.

Definisjon

Observer Pattern definerer et en-til-mange forhold mellom en samling av objekter. Når et objekt endres, vil de andre oppdateres om endringene.

Vi har et subjekt som er eier av en samling data. Vi har en eller flere observere som blir oppdatert når subjektet endrer seg. De som observerer vil derfor være avhengig av subjektet, og vi unngår at flere objekter kontrollerer de samme dataene.

For å implementere mønsteret kan vi ta utgangspunkt i to kontrakter (interfaces), en for subjekt og en for observer.


observer_kontrakt


Eksempel

  • Vi har et regneark som viser grafer basert på underliggende tabelldata. Når tabelldataene endres vil grafene endres.

I dette tilfellet er tabelldataene subjektet som de forskjellige grafene observerer. Når tabelldataer endres vil tabelldataene selv gi grafene beskjed om at det har skjedd endringer i dataene. Grafene kan på bakgrunn av dette velge å oppdatere seg. Grafer kan her være kakediagram, stolpediagram og lignende representasjoner. Det viktigeste poenger er at vi kan ha flere forskjellige grafrepresantasjoner som fungerer uavhengig av hverandre. Vi kan legge til, eller fjerne graftyper uten å måtte endre på selve logikken (tabelldataene) våre.

Noen fordeler

Ved å bruke observer pattern får vi et løst sammensatt (loose coupling) design. Subjektet og observer kan jobbe sammen men vet lite om hverandre.

  • Subjektet vet kun at observer implementerer kontrakten "observer".
  • Vi kan legge til og fjerne observere fortløpende.
  • Vi kan legge til nye type observere uten å ta hensyn til subjektet. Så lenge den nye observertypen implementerer kontrakten vil alt rulle og gå.
  • Vi kan gjenbruke subjekt og / eller observer hver for seg i andre sammenhenger siden de ikke avhenger av hverandre.
  • Vi kan endre subjektet og / eller observer så lenge vi implementerer kontraktene.

Med andre ord er det mange fordeler ved å tilstrebe et løst sammensatt design.

Implementasjon

Observer pattern er implementert i pakken java.util.Observable. Vi velger å presentere en minimalistisk versjon her, basert på definisjonen over, og ikke java.util.Observable, men fremgangsmåten er den samme.

Vi beggyner med kontraktene "Subjekt" og "Observer".

{codecitation class="brush: plain; gutter: true;"}

public interface Subjekt {

public void registerObserver(Observer o);

public void removeObserver(Observer o);
}

{codecitation class="brush: plain; gutter: true;"}

public interface Observer {

public void update(Subjekt o);
}

Tagged as : diverse