Java Academy · leksjon

Observer-mønsteret: hendelsesvarsling

Implementer Observer for å koble hendelsesprodusenter fra konsumenter i et system for aksjekurser.

Leksjon 1 av 414 trinn

Observer-mønsteret: hendelsesvarsling er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hensikten med Observer

Observer, også kalt Publish-Subscribe, definerer en én-til-mange-avhengighet: Når tilstanden til subjektet endres, varsles alle registrerte observatører automatisk.

Subjekt- og observatørgrensesnitt

Subjektet holder oversikt over en liste med observatører og varsler dem. Observatørene implementerer en update-metode for å reagere på hendelser.

public interface Observer {
    void update(String event, Object data);
}
public interface Subject {
    void addObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers(String event, Object data);
}

Konkret subjekt: aksjekursvisning

Subjektet inneholder tilstanden og kaller notifyObservers hver gang tilstanden endres. Det administrerer listen over observatører.

public class StockTicker implements Subject {
    private final List<Observer> observers = new ArrayList<>();
    private double price;
    public void addObserver(Observer o)    { observers.add(o); }
    public void removeObserver(Observer o) { observers.remove(o); }
    public void setPrice(double p) {
        this.price = p;
        notifyObservers("PRICE_CHANGED", p);
    }
    public void notifyObservers(String ev, Object data) {
        for (Observer o : observers) o.update(ev, data);
    }
}

Konkrete observatører

Hver observatør reagerer forskjellig på det samme varselet. Observatører kan legges til ved kjøring uten at subjektet må endres.

public class AlertSystem implements Observer {
    public void update(String ev, Object data) {
        if ((double) data < 100) System.out.println("ALERT: Low price!");
    }
}
public class Logger implements Observer {
    public void update(String ev, Object data) {
        System.out.println("LOG: " + ev + " = " + data);
    }
}

Koble til observatører

Registrer observatører på subjektet. De reagerer alle når subjektet endres. Avregistrer dem for å slutte å motta oppdateringer.

StockTicker ticker = new StockTicker();
ticker.addObserver(new AlertSystem());
ticker.addObserver(new Logger());
ticker.setPrice(95.5); // both observers notified

java.util.Observable — foreldet

JDK hadde java.util.Observable og java.util.Observer, men disse er foreldet siden Java 9. Implementer ditt eget opplegg, eller bruk reaktive biblioteker som RxJava eller Project Reactor.

PropertyChangeListener

JavaBeans tilbyr PropertyChangeSupport — en innebygd observatørmekanisme for endringer i egenskaper, som brukes mye i Swing og JavaFX.

public class Model {
    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
    private int value;
    public void addPropertyChangeListener(PropertyChangeListener l) { pcs.addPropertyChangeListener(l); }
    public void setValue(int v) {
        int old = this.value; this.value = v;
        pcs.firePropertyChange("value", old, v);
    }
}

Funksjonell observatør med Consumer

Bruk Consumer<T> som en lettvektsobservatør i stedet for et eget grensesnitt. Det passer utmerket for enkle hendelsestilbakekall.

List<Consumer<Double>> listeners = new ArrayList<>();
listeners.add(p -> { if (p < 100) System.out.println("Low price"); });
listeners.add(p -> System.out.println("Price: " + p));
double newPrice = 95.5;
listeners.forEach(l -> l.accept(newPrice));

Observer kontra Event Bus

En eventbuss, som Guava EventBus, kobler subjekt og observatør enda løsere. Subjektet legger hendelser på bussen uten å vite hvem som lytter. Observatører abonnerer ved hjelp av en metodeannotasjon.

// Guava EventBus example
EventBus bus = new EventBus();
bus.register(new Logger());       // subscribe
bus.post(new PriceEvent(95.5));   // publish

Trådsikkerhet i Observer

Hvis observatører kan legges til eller fjernes fra flere tråder, må listen beskyttes med synchronized, eller man kan bruke CopyOnWriteArrayList ved arbeidsbelastninger med mange varsler.

private final List<Observer> observers = new CopyOnWriteArrayList<>();

Unngå minnelekkasjer

Sterke referanser i observatørlisten hindrer søppelrydding. Bruk WeakReference<Observer>, eller avregistrer alltid observatører når de ikke lenger trengs.

Observer i virkelige rammeverk

Spring sin ApplicationEventPublisher, Android LiveData og JavaFX-egenskaper er alle implementasjoner av Observer-mønsteret på ulike abstraksjonsnivåer.

Kort kontrollspørsmål

Hva er den viktigste fordelen med Observer-mønsteret?

Oppsummering

Observer definerer en én-til-mange-kjede for varsling. Det kan implementeres ved hjelp av grensesnitt eller funksjonelle consumers. Bruk CopyOnWriteArrayList for trådsikkerhet, og avregistrer alltid observatører for å unngå lekkasjer.

Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Observer-mønsteret: hendelsesvarsling» gratis?

Ja – hele teksten i «Observer-mønsteret: hendelsesvarsling» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Observer-mønsteret: hendelsesvarsling»?

Implementer Observer for å koble hendelsesprodusenter fra konsumenter i et system for aksjekurser. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Observer-mønsteret: hendelsesvarsling»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Observer-mønsteret: hendelsesvarsling
  2. Strategy-mønsteret: utskiftbare algoritmer
  3. Command-mønsteret: kapsle inn handlinger
  4. Template Method: definere algoritmeskjeletter
← Tilbake til Java Academy