Implémentation du motif Observateur (Observer) avec support des priorités et du filtrage

TypeScript Hard classes

Tâche «Implémentation du motif Observateur (Observer) avec support des priorités et du filtrage»

Créez une classe `EventBus` qui implémente le motif Observateur. Elle doit permettre de s'abonner à des événements avec indication de priorité (nombre entier, plus il est petit, plus tôt le gestionnaire est appelé) et un filtre optionnel (fonction qui prend les données et retourne true si le gestionnaire doit être appelé). Lors de la publication d'un événement, les gestionnaires sont appelés dans l'ordre de priorité, uniquement si le filtre (s'il est défini) retourne true. Le gestionnaire peut être désabonné par identifiant. Implémentez les méthodes : `subscribe(event: string, handler: Function, priority: number = 0, filter?: (data: any) => boolean): string` (retourne l'id de l'abonnement), `unsubscribe(id: string): void`, `publish(event: string, data: any): void`. Si une exception est levée lors de l'appel d'un gestionnaire, elle doit être interceptée et affichée dans la console, mais ne doit pas interrompre l'exécution des autres gestionnaires. Données d'entrée : séquence de commandes (subscribe, unsubscribe, publish). Sortie : résultat de l'exécution des commandes (pour publish — via la console).

Format d\ entrée

Séquence de commandes, chacune sur une ligne séparée. Commandes : subscribe <event> <priority> [filter], unsubscribe <id>, publish <event> <data>. Pour subscribe : event — chaîne de caractères, priority — nombre entier, filter — chaîne de caractères optionnelle avec le code du filtre (par exemple, 'data>5'). Pour publish : event — chaîne de caractères, data — valeur JSON (nombre, chaîne, objet).

Format de sortie

Pour chaque commande publish, le résultat du travail des gestionnaires est affiché dans l'ordre de leur appel : une ligne de la forme 'Handler <id> called with <data>', chacune sur une nouvelle ligne. S'il n'y a pas de gestionnaires — 'No handlers'. Les erreurs des gestionnaires sont ignorées, mais leurs messages sont affichés dans la console (non vérifiés dans les tests).

Exemples

Exemple 1

ENTRÉE
2 Circle 0.0 0.0 5.0 Rectangle 3.0 2.0 7.0 0.0
SORTIE

Exemple 2

ENTRÉE
2 Point 1.0 2.0 Circle 3.0 4.0 1.0
SORTIE
main.ts