Hoppa till innehållet

Observatör (designmönster)

Från Wikipedia
UML-diagram av designmönstrets struktur

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.

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')
Den här artikeln är helt eller delvis baserad på material från engelskspråkiga Wikipedia.