> For the complete documentation index, see [llms.txt](https://biglazytables.gitbook.io/big-lazy-tables/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://biglazytables.gitbook.io/big-lazy-tables/konzepte/observer-pattern.md).

# Observer Pattern

[BLT ](/big-lazy-tables/bachelorarbeit-ip6-big-lazy-tables-fur-das-kolibri-toolkit.md)bedient sich dem Verhaltens-Entwurfsmuster [Observer](https://refactoring.guru/design-patterns/observer).&#x20;

**Allgemein**

Das Observer Entwurfsmuster ermöglicht, dass sich ein Objekt auf ein anderes Objekt registrieren kann. Durch diese Registrierung erfährt nun das erste Objekt immer, wenn sich etwas im zweiten Objekt geändert hat. Man spricht oft von Subscriber und Publisher.

Der Subscriber kann nun bestimmen, wie er reagiert, wenn eine Änderung im Publisher stattfindet.

Ein grosser Vorteil darin besteht, dass der Zustand konsistent bleibt, denn der Subscriber passt nun bei einer Änderung im Publisher den Zustand automatisch an. Zudem lässt dieses Verfahren zu, dass mehrere Subscriber einem Publisher "zuhören" können.&#x20;

Wichtig dabei zu beachten ist, dass ab einer bestimmten Komplexität der Applikation, Gefahr besteht, dass sich eine Aktualisierungskette bildet, sprich dass eine einzige Änderung eine ganze Kette von Reaktionen auslöst. Der Entwickler muss dies manuell unter Kontrolle halten, da Observer sich untereinander nicht kennen und nicht abschätzen können, welche Folgen eine Änderung hat.

**Konkret**

Werte wie der [`scrollIndex`](/big-lazy-tables/verweise/glossar.md#scrollindex), das [Filter Objekt](/big-lazy-tables/funktionen/filtering-and-sorting.md#filter-objekt) oder der anzuzeigende Datensatz sind im [Presentation Model](/big-lazy-tables/system/module/presentation-model.md) als [Observable ](https://github.com/WebEngineering-FHNW/Kolibri/blob/main/docs/src/kolibri/observable.js)abgelegt.&#x20;

{% hint style="info" %}
Eine ausführliche Dokumentation und mehrere Beispiel Implementierungen zum Observable finden sich in der [Forschungsarbeit IP6 - Fortschrittliche Abstraktionen im Lambda Kalkül](https://mattwolf-corporation.gitbook.io/ip6-lambda-calculus/forschungsarbeit-ip6-fortschrittliche-abstraktionen-im-lambda-kalkuel/observable).
{% endhint %}

Ein Projektor registriert sich über die Funktion onChange() darauf, dass wenn sich der Wert im Model ändert, er notifiziert wird. Diese Notifizierung löst aus, dass der Projektor seine visuelle Darstellung dem Model anpasst.

Ein Projektor ist ein indirekter Subscriber vom Publisher im Model, welcher sich über über den Controller registriert.

Neue Subscriber können eingeführt werden, ohne dass im Publisher (Model) eine Anpassung stattfinden muss.&#x20;

Die folgende Visualisierung zeigt wie BLT das Observer Pattern intern umsetzt:

![BLT Observer Pattern](https://3950294961-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fc3pqMW5ZzqJsqoL0PPqS%2Fuploads%2FFxytnA9Q22eD8555k6J2%2Fobserver.png?alt=media\&token=155ded4d-6044-4a66-9fb4-61f29a9a6ba4)

Die `onChange()` Funktion im Controller ist verknüpft mit der `onChange()` Funktion aus dem Model und leitet die Notifikation lediglich weiter an die Projektoren. Nach dem Callback löst der Projektor eine definierte `update()` Funktion aus.
