Observer-mønsteret: hændelsesnotifikation
Implementér Observer for at afkoble producenter af hændelser fra forbrugere i et system til aktiekurser.
Observer-mønsteret: hændelsesnotifikation er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.
Observer-mønsterets formål
Observer (også kaldet udgiver-abonnent) definerer en en-til-mange-afhængighed: Når subjektets tilstand ændres, får alle registrerede observatører automatisk besked.
Subjekt- og observatørgrænseflader
Subjektet vedligeholder en liste over observatører og giver dem besked. Observatørerne implementerer en update-metode, der reagerer på hændelser.
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: Aktiekursvisning
Subjektet indeholder tilstanden og kalder notifyObservers, hver gang tilstanden ændres. Det administrerer observatørlisten.
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 forskelligt på den samme meddelelse. Du kan tilføje observatører under kørsel uden at ændre subjektet.
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);
}
}Tilkobling af observatører
Registrér observatørerne på subjektet. De reagerer alle, når subjektet ændres. Afregistrer dem for at stoppe med at modtage opdateringer.
StockTicker ticker = new StockTicker();
ticker.addObserver(new AlertSystem());
ticker.addObserver(new Logger());
ticker.setPrice(95.5); // both observers notifiedjava.util.Observable — Forældet
JDK'et havde java.util.Observable og java.util.Observer, men de har været forældede siden Java 9. Implementér din egen løsning, eller brug reaktive biblioteker som RxJava eller Project Reactor.
PropertyChangeListener
JavaBeans leverer PropertyChangeSupport — en indbygget observatørmekanisme til ændringer af bean-egenskaber, som bruges meget 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);
}
}Funktionel observatør med Consumer
Brug Consumer<T> som en letvægtsobservatør i stedet for en dedikeret grænseflade — perfekt til simple tilbagekald ved hændelser.
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 hændelsesbus
En hændelsesbus (som Guava EventBus) afkobler subjekt og observatør yderligere — subjektet sender hændelser til bussen uden at vide, hvem der lytter. Observatørerne abonnerer via en metodeannotering.
// Guava EventBus example
EventBus bus = new EventBus();
bus.register(new Logger()); // subscribe
bus.post(new PriceEvent(95.5)); // publishTrådsikkerhed i Observer
Hvis observatører kan tilføjes eller fjernes fra flere tråde, skal du beskytte listen med synchronized eller bruge CopyOnWriteArrayList ved arbejdsbelastninger med mange meddelelser.
private final List<Observer> observers = new CopyOnWriteArrayList<>();Undgåelse af hukommelseslækager
Stærke referencer i observatørlisten forhindrer GC. Brug WeakReference<Observer>, eller afregistrér altid observatørerne, når der ikke længere er brug for dem.
Observer i virkelige rammeværker
Spring's ApplicationEventPublisher, Android LiveData og JavaFX-egenskaber er alle implementeringer af Observer-mønsteret på forskellige abstraktionsniveauer.
Hurtigt tjek
Hvad er den vigtigste fordel ved Observer-mønsteret?
Opsummering
Observer definerer en en-til-mange-kæde af meddelelser. Implementér det via grænseflader eller funktionelle consumers. Brug CopyOnWriteArrayList for trådsikkerhed, og afregistrér altid observatører for at forhindre lækager.
Lær Java med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 104
- Lektioner
- 374
Ofte stillede spørgsmål
Er lektionen “Observer-mønsteret: hændelsesnotifikation” gratis?
Ja — hele teksten til “Observer-mønsteret: hændelsesnotifikation” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Observer-mønsteret: hændelsesnotifikation”?
Implementér Observer for at afkoble producenter af hændelser fra forbrugere i et system til aktiekurser. Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Java Academy?
Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Observer-mønsteret: hændelsesnotifikation”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Java Academy-lektion?
Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Observer-mønsteret: hændelsesnotifikation
- Strategy-mønsteret: udskiftelige algoritmer
- Command-mønsteret: indkapsling af handlinger
- Template Method: definition af algoritmeskeletter