Observatör (designmönster)

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.

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

  • Model-View-Controller (MVC)
  • Klient–server

Referenser

Den här artikeln är helt eller delvis baserad på material från engelskspråkiga Wikipedia.
  1. ^ ”Model-View-Controller”. MSDN. https://msdn.microsoft.com/en-us/library/ff649643.aspx. Läst 21 april 2015. 
v  r
Designmönster inom programmering
Gang of Fours mönster
Skapandemönster
Abstrakt fabrik · Byggare · Fabriksmetod · Prototyp · Singleton
Strukturmönster
Adapter · Brygga · Dekoratör · Fasad · Flugvikt · Komposit · Proxy
Beteendemönster
Ansvarskedja · Besökare · Interpreter · Iterator · Kommando · Mallmetod · Mediator · Memento · Observatör · Strategi · Tillstånd
Arkitektmönster
Model-View-Controller
Personer
Christopher Alexander · Erich Gamma · Ralph Johnson · John Vlissides · Grady Booch · Kent Beck · Ward Cunningham · Martin Fowler · Robert Martin · Jim Coplien · Douglas Schmidt · Linda Rising
Böcker