In diesem Projekt habe ich eine neue Programmiersprache, Hyperlambda, für die Erstellung von Active Events-Hooks erstellt. Dies ermöglicht es mir, die Implementierung meiner für-jede und während Aussagen zu ändern, wenn ich will. Ich kann auch meine anderen Anweisungen horizontal ausskalieren, um auf einem anderen Server ausgeführt zu werden. Und ich kann die Programmiersprache einfach erweitern, um meine eigenen domänenspezifischen Schlüsselwörter zu erstellen, um zu tun, was meine Domain-Probleme erfordern. Bibliotheken und Frameworks sind für JavaScript vorhanden, um das Beobachtermuster zu verwenden. Eine solche Bibliothek ist RxJS unten gesehen. Ereigniskanäle werden vom Ereignismediator verwendet, um bestimmte Verarbeitungsereignisse, die sich auf jeden Schritt im ursprünglichen Ereignis beziehen, asynchron an die Ereignisprozessoren zu übergeben. Die Ereigniskanäle können entweder Nachrichtenwarteschlangen oder Nachrichtenthemen sein, obwohl Nachrichtenthemen mit der Mediatortopologie am häufigsten verwendet werden, sodass Verarbeitungsereignisse von mehreren Ereignisprozessoren verarbeitet werden können (jeweils eine andere Aufgabe basierend auf dem empfangenen Verarbeitungsereignis). Beispielsweise können einfache Ereignisse durch einen Sensor erzeugt werden, der Veränderungen des Reifendrucks oder der Umgebungstemperatur erkennt. Der falsche Reifendruck des Autos erzeugt ein einfaches Ereignis vom Sensor, das ein gelbes Licht auslöst, das den Fahrer über den Zustand eines Reifens informiert. Dies ist nur eine Standard-POCO-Klasse, die verwendet wird, um das Ereignis darzustellen. Sie sollte alle erforderlichen Informationen enthalten, um auf das Ereignis zu reagieren.

Beispiel: Das Konvertieren der aus einem so unterschiedlichen Datensatz gesammelten Daten in eine einzige standardisierte Form von Daten für die Auswertung ist eine wichtige Aufgabe bei der Konzeption und Implementierung dieser ersten logischen Ebene. [6] Da ein Ereignis jedoch ein stark deklarativer Rahmen ist, können alle Informationsoperationen leicht angewendet werden, wodurch ein hohes Maß an Standardisierung entfällt. [Zitat erforderlich] In einem meiner Projekte stieß ich auf eine Situation, in der eines der beobachteten Objekte zerstört wurde und Beobachter benachrichtigt werden mussten, bevor ich dies tat. Das einzige, was ich tun musste, war, die Benachrichtigung als Eine Requisierung für alle Beobachter hinzuzufügen und das Ereignis abzufeuern, bevor der Beobachter zerstört wurde. Das Schöne daran ist, dass der Code nur kompiliert wird, wenn alle Beobachter einen Handler für das neu erstellte Ereignis implementieren, daher werden Sie weniger wahrscheinlich vergessen, einige von ihnen zu ändern. In meinem Fall hatte ich eine anständige Menge an möglichen Beobachtern, und es ist schön zu wissen, dass ich Änderungen vornehmen kann, ohne ein paar oder mehr versteckte Bugs zu erstellen. Die meisten vorhandenen GUI-Entwicklungstools und -architekturen basieren auf ereignisgesteuerter Programmierung. [2] Das Java AWT-Framework verarbeitet alle UI-Änderungen in einem einzelnen Thread, dem so genannten Ereignisdispatching-Thread. Ebenso werden alle UI-Updates im Java-Framework JavaFX im JavaFX-Anwendungsthread ausgeführt.

[3] Im Gegensatz zu einigen bescheideneren Mustern in diesem Buch sind Veranstaltungswarteschlangen komplex und haben tendenziell einen weitreichenden Einfluss auf die Architektur unserer Spiele. Das bedeutet, dass Sie sich genau überlegen möchten, wie – oder ob – Sie eine verwenden. Es wird hauptsächlich zur Implementierung verteilter Ereignisbehandlungssysteme in ”ereignisgesteuerter” Software verwendet. In diesen Systemen wird das Subjekt in der Regel als ”Strom der Ereignisse” oder ”Streamquelle von Ereignissen” bezeichnet, während die Beobachter als ”Senke der Ereignisse” bezeichnet werden. Die Stream-Nomenklatur simuliert oder passt sich einem physikalischen Setup an, bei dem die Beobachter physisch getrennt sind und keine Kontrolle über die emittierten Ereignisse des Subjekts/Stream-Source haben. Dieses Muster passt dann perfekt zu jedem Prozess, bei dem Daten über E/A ankommen, d. h., wo Daten der CPU beim Start nicht zur Verfügung stehen, sondern ”zufällig” ankommen können (HTTP-Anfragen, GPIO-Daten, Benutzereingaben von Tastatur/Maus/…, verteilte Datenbanken und Blockchains, …). Die meisten modernen Sprachen verfügen über integrierte ”Ereignis”-Konstrukte, die die Beobachtermusterkomponenten implementieren. Obwohl die meisten ”Beobachter”-Implementierungen nicht obligatorisch sind, werden Hintergrundthreads verwendet, die auf Themenereignisse und andere Unterstützungsmechanismen aus dem Kernel lauschen (Linux epoll, …) Auf den ersten Blick erscheint das Observer-Muster fast identisch mit dem Pub-Sub-Muster.