Observatör (designmönster)
Observatör är ett designmönster där ett objekt håller i en lista över beroenden, som kallas "observatörer", och meddelar dem automatiskt när någonting ändras, vanligtvis genom att anropa en av deras metoder. Den används huvudsakligen för att implementera distribuerade händelsehanterande system. Designmönstret är även en viktig del i model–view–controller.[1] Designmönstret är implementerat i ett flertal programbibliotek och system, inklusive nästan alla GUI-toolkit.
Observatör kan orsaka minnesläckage eftersom det kräver både explicit registrering och avregistrering, då objektet håller i starka referenser till observatörerna som håller dem igång. Detta kan förhindras genom att objektet håller i svaga referenser till observatörerna.
Exempel
Nedan finns ett exempel i Java som läser tangentbordsinmatningar och behandlar varje inmatning som en händelse. Exemplet är byggt med biblioteksklasserna java.util.Observer och java.util.Observable. När en textsträng hämtas från System.in anropas metoden notifyObservers
för att meddela alla observatörer om händelsen genom att anropa deras uppdateringsmetoder, vilket i detta fall är en lambdafunktion.
import java.util.Observable;
import java.util.Scanner;
class EventSource extends Observable implements Runnable {
public void run() {
while (true) {
String response = new Scanner(System.in).next();
setChanged();
notifyObservers(response);
}
}
}
import java.util.Observable;
import static java.lang.System.out;
class MyApp {
public static void main(String[] args) {
out.println("Enter Text >");
EventSource eventSource = new EventSource();
eventSource.addObserver((Observable obj, Object arg) -> {
out.println("\nReceived response: " + arg);
});
new Thread(eventSource).start();
}
}
Ett liknande exempel i Python:
class Observable:
def __init__(self):
self.__observers = []
def register_observer(self, observer):
self.__observers.append(observer)
def notify_observers(self, *args, **kwargs):
for observer in self.__observers:
observer.notify(self, *args, **kwargs)
class Observer:
def __init__(self, observable):
observable.register_observer(self)
def notify(self, observable, *args, **kwargs):
print('Got', args, kwargs, 'From', observable)
subject = Observable()
observer = Observer(subject)
subject.notify_observers('test')
Se även
Referenser
- Den här artikeln är helt eller delvis baserad på material från engelskspråkiga Wikipedia.
- ^ ”Model-View-Controller”. MSDN. https://msdn.microsoft.com/en-us/library/ff649643.aspx. Läst 21 april 2015.
|
Media som används på denna webbplats
A UML diagram of the observer pattern.