Implementierung des Beobachter-Musters (Observer) mit Prioritätsunterstützung und Filterung

TypeScript Hard classes

Aufgabe «Implementierung des Beobachter-Musters (Observer) mit Prioritätsunterstützung und Filterung»

Erstellen Sie eine Klasse `EventBus`, die das Beobachter-Muster implementiert. Sie soll das Abonnieren von Ereignissen mit Angabe einer Priorität (ganze Zahl, je kleiner, desto früher wird aufgerufen) und einem optionalen Filter (Funktion, die Daten entgegennimmt und true zurückgibt, wenn der Handler aufgerufen werden soll) ermöglichen. Bei der Veröffentlichung eines Ereignisses werden die Handler in der Reihenfolge der Priorität aufgerufen, jedoch nur, wenn der Filter (falls angegeben) true zurückgibt. Ein Handler kann über seine ID abgemeldet werden. Implementieren Sie die Methoden: `subscribe(event: string, handler: Function, priority: number = 0, filter?: (data: any) => boolean): string` (gibt die Abonnement-ID zurück), `unsubscribe(id: string): void`, `publish(event: string, data: any): void`. Wenn beim Aufruf eines Handlers eine Ausnahme auftritt, muss diese abgefangen und auf der Konsole ausgegeben werden, darf aber die Ausführung anderer Handler nicht unterbrechen. Eingabedaten: eine Folge von Befehlen (subscribe, unsubscribe, publish). Ausgabe: das Ergebnis der Befehlsausführung (für publish über die Konsole).

Eingabeformat

Eine Folge von Befehlen, jeder in einer separaten Zeile. Befehle: subscribe <Ereignis> <Priorität> [Filter], unsubscribe <ID>, publish <Ereignis> <Daten>. Für subscribe: Ereignis — Zeichenkette, Priorität — ganze Zahl, Filter — optionale Zeichenkette mit Filtercode (z. B. 'data>5'). Für publish: Ereignis — Zeichenkette, Daten — JSON-Wert (Zahl, Zeichenkette, Objekt).

Ausgabeformat

Für jeden publish-Befehl wird das Ergebnis der Handler-Aufrufe in der Reihenfolge ihres Aufrufs ausgegeben: eine Zeile der Form 'Handler <ID> called with <Daten>', jede in einer neuen Zeile. Wenn es keine Handler gibt: 'No handlers'. Fehler von Handlern werden ignoriert, aber ihre Meldungen werden auf der Konsole ausgegeben (in den Tests nicht überprüft).

Beispiele

Beispiel 1

EINGABE
2 Circle 0.0 0.0 5.0 Rectangle 3.0 2.0 7.0 0.0
AUSGABE

Beispiel 2

EINGABE
2 Point 1.0 2.0 Circle 3.0 4.0 1.0
AUSGABE
main.ts