Observer-patroon: gebeurtenismeldingen
Implementeer Observer om producenten en consumenten van gebeurtenissen in een systeem voor aandelenkoersen van elkaar los te koppelen.
Observer-patroon: gebeurtenismeldingen is een gratis Java Academy-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.
De intentie van Observer
Observer (ook Publish-Subscribe genoemd) definieert een één-op-veelafhankelijkheid: wanneer het onderwerp van toestand verandert, worden alle geregistreerde waarnemers automatisch op de hoogte gebracht.
Interfaces van onderwerp en waarnemer
Het onderwerp houdt een lijst met waarnemers bij en brengt hen op de hoogte. Waarnemers implementeren een update-methode om op gebeurtenissen te reageren.
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);
}Concreet onderwerp: aandelenkoers
Het onderwerp bevat de toestand en roept notifyObservers aan telkens wanneer die toestand verandert. Het beheert de lijst met waarnemers.
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);
}
}Concrete waarnemers
Elke waarnemer reageert anders op dezelfde melding. Voeg tijdens runtime waarnemers toe zonder het onderwerp te wijzigen.
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);
}
}Waarnemers verbinden
Registreer waarnemers bij het onderwerp. Ze reageren allemaal wanneer het onderwerp verandert. Maak hun registratie ongedaan om geen updates meer te ontvangen.
StockTicker ticker = new StockTicker();
ticker.addObserver(new AlertSystem());
ticker.addObserver(new Logger());
ticker.setPrice(95.5); // both observers notifiedjava.util.Observable — verouderd
De JDK bevatte java.util.Observable en java.util.Observer, maar die zijn sinds Java 9 verouderd. Implementeer je eigen oplossing of gebruik reactieve bibliotheken zoals RxJava of Project Reactor.
PropertyChangeListener
Java-beans bieden PropertyChangeSupport — een ingebouwd mechanisme voor wijzigingen in bean-eigenschappen, dat veel wordt gebruikt in Swing en 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);
}
}Functionele waarnemer met Consumer
Gebruik Consumer<T> als lichtgewicht waarnemer in plaats van een speciale interface — ideaal voor eenvoudige terugbelacties bij gebeurtenissen.
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 versus gebeurtenissenbus
Een gebeurtenissenbus (zoals Guava EventBus) ontkoppelt onderwerp en waarnemer nog verder — het onderwerp plaatst gebeurtenissen op de bus zonder te weten wie luistert. Waarnemers abonneren zich via een methode-annotatie.
// Guava EventBus example
EventBus bus = new EventBus();
bus.register(new Logger()); // subscribe
bus.post(new PriceEvent(95.5)); // publishThreadveiligheid in Observer
Als waarnemers vanuit meerdere threads kunnen worden toegevoegd of verwijderd, bescherm je de lijst met synchronized of gebruik je CopyOnWriteArrayList voor werklasten met veel meldingen.
private final List<Observer> observers = new CopyOnWriteArrayList<>();Geheugenlekken voorkomen
Sterke verwijzingen in de lijst met waarnemers voorkomen dat de garbagecollector objecten opruimt. Gebruik WeakReference<Observer> of maak altijd de registratie van waarnemers ongedaan wanneer je ze niet meer nodig hebt.
Observer in echte frameworks
ApplicationEventPublisher van Spring, Android LiveData en JavaFX-eigenschappen zijn allemaal implementaties van het Observer-patroon op verschillende abstractieniveaus.
Korte controle
Wat is het belangrijkste voordeel van het Observer-patroon?
Samenvatting
Observer definieert een één-op-veel-keten voor meldingen. Implementeer het via interfaces of functionele consumers. Gebruik CopyOnWriteArrayList voor threadveiligheid en maak altijd de registratie van waarnemers ongedaan om lekken te voorkomen.
Leer Java met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 104
- Lessen
- 374
Veelgestelde vragen
Is de les “Observer-patroon: gebeurtenismeldingen” gratis?
Ja — de volledige tekst van “Observer-patroon: gebeurtenismeldingen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.
Wat leer ik in “Observer-patroon: gebeurtenismeldingen”?
Implementeer Observer om producenten en consumenten van gebeurtenissen in een systeem voor aandelenkoersen van elkaar los te koppelen. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Java Academy te beginnen?
Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.
Hoe lang duurt de les “Observer-patroon: gebeurtenismeldingen”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Java Academy?
Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Observer-patroon: gebeurtenismeldingen
- Strategy-patroon: uitwisselbare algoritmen
- Command-patroon: acties inkapselen
- Template Method: algoritmeskeletten definiëren