Event Bus et le pattern Observer en Java
\n\nLes applications modernes sont de plus en plus construites sur une architecture orientée événements. Deux outils clés pour implémenter ce modèle en Java sont le pattern Observer et son évolution — l'Event Bus (bus d'événements). Dans cet article, nous analyserons leurs différences, comment implémenter chacun d'eux, et quelles bibliothèques peuvent simplifier le développement.
\n\nQu'est-ce que le pattern Observer ?
\n\nLe pattern Observer (Observateur) est un modèle de conception comportemental dans lequel un objet (sujet) notifie plusieurs objets dépendants (observateurs) d'un changement de son état. En Java, ce pattern est souvent utilisé dans les interfaces graphiques, les systèmes de journalisation et le traitement d'événements.
\n\nComposants clés :
\n- \n
- Subject — source d'événements, gère la liste des observateurs \n
- Observer — interface implémentée par tous les abonnés \n
- ConcreteSubject — implémentation concrète du sujet \n
- ConcreteObserver — observateur concret \n
Exemple d'implémentation en Java pur :
\n\n// Interface de l'observateur\ninterface Observer {\n void update(String event);\n}\n\n// Interface du sujet\ninterface Subject {\n void attach(Observer observer);\n void detach(Observer observer);\n void notifyObservers(String event);\n}\n\n// Sujet concret\nclass EventManager implements Subject {\n private List<Observer> observers = new ArrayList<>();\n \n @Override\n public void attach(Observer observer) {\n observers.add(observer);\n }\n \n @Override\n public void detach(Observer observer) {\n observers.remove(observer);\n }\n \n @Override\n public void notifyObservers(String event) {\n for (Observer observer : observers) {\n observer.update(event);\n }\n }\n \n public void fireEvent(String event) {\n System.out.println("Événement : " + event);\n notifyObservers(event);\n }\n}\n\n// Observateur concret\nclass LogObserver implements Observer {\n @Override\n public void update(String event) {\n System.out.println("Log : événement reçu - " + event);\n }\n}\n\n// Utilisation\npublic class ObserverDemo {\n public static void main(String[] args) {\n EventManager manager = new EventManager();\n manager.attach(new LogObserver());\n manager.fireEvent("Utilisateur connecté");\n }\n}\n\nQu'est-ce qu'un Event Bus ?
\n\nL'Event Bus (bus d'événements) est un mécanisme centralisé d'échange de messages entre les composants d'une application. Contrairement à l'Observer classique où le sujet gère directement les abonnés, l'Event Bus sépare les expéditeurs et les destinataires des événements via un bus commun.
\n\nAvantages de l'Event Bus :
\n- \n
- Faible couplage des composants \n
- Abonnement et publication simplifiés \n
- Prise en charge du filtrage des événements par type \n
- Traitement asynchrone (optionnel) \n
Bibliothèque Guava EventBus
\n\nGoogle Guava fournit une implémentation puissante de l'Event Bus. Elle est largement utilisée dans les projets industriels et facile à intégrer.
\n\nAjout Maven :
\n<dependency>\n <groupId>com.google.guava</groupId>\n <artifactId>guava</artifactId>\n <version>33.0.0-jre</version>\n</dependency>\n\nExemple d'utilisation :
\n\nimport com.google.common.eventbus.EventBus;\nimport com.google.common.eventbus.Subscribe;\n\n// Classe d'événement\nclass UserLoginEvent {\n private final String username;\n \n public UserLoginEvent(String username) {\n this.username = username;\n }\n \n public String getUsername() {\n Aussi dans la bibliothèque
Clap pour Rust : guide complet avec exemples
afero pour Go : guide complet avec exemples
ORM pour C++ : comparaison et exemples d'utilisation (ODB, SOCI, SQLiteCpp)
Travailler avec Apache Kafka en C++ : bibliothèques et exemples
Apprentissage automatique en Java : aperçu des principales bibliothèques de développement