Observer 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.
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);
}