Event Bus et le pattern Observer en Java : comment construire une architecture d'événements flexible
Dans le développement Java moderne, il est souvent nécessaire de notifier certains composants du système des actions survenues dans d'autres, sans créer de dépendance rigide entre eux. Le pattern Observer classique résout ce problème, mais son implémentation manuelle peut entraîner une prolifération de code, des fuites de mémoire et des difficultés de débogage. L'Event Bus vient à la rescousse — une implémentation prête à l'emploi du pattern "éditeur-abonné" (Publish-Subscribe) qui prend en charge la gestion des abonnements et la livraison des événements.
Dans cet article, nous analyserons en détail ce qu'est l'Event Bus, comment il est lié au pattern Observer, et nous montrerons un exemple pratique d'utilisation de la bibliothèque populaire greenrobot EventBus pour les applications Java. Ce contenu sera utile aux développeurs qui souhaitent créer des systèmes faiblement couplés, facilement testables et évolutifs.
Pattern Observer : le fondement de l'Event Bus
Le pattern Observer définit une relation "un à plusieurs" entre les objets : lorsqu'un objet (l'éditeur) change d'état, tous les objets qui en dépendent (les abonnés) en sont automatiquement notifiés. Dans l'implémentation classique, l'éditeur stocke une liste d'abonnés et appelle leurs méthodes directement.
Inconvénients de l'implémentation manuelle :
- Couplage fort : l'abonné doit explicitement implémenter l'interface Observer.
- Gestion du cycle de vie : il est nécessaire de désabonner manuellement les abonnés, sinon des fuites de mémoire peuvent survenir.
- Difficulté de passage à l'échelle : avec l'augmentation du nombre d'abonnés, le code devient difficile à maintenir.
L'Event Bus résout ces problèmes en agissant comme un intermédiaire central. L'éditeur ne connaît pas les abonnés — il envoie simplement l'événement dans le bus. Le bus trouve lui-même tous les abonnés enregistrés pour ce type d'événement et leur livre le message.
Découverte de greenrobot EventBus
EventBus de greenrobot est une bibliothèque légère pour Java et Android qui implémente le pattern Observer à l'aide d'annotations. Elle permet de :
- Envoyer des événements de tout type (classes POJO).
- S'abonner aux événements par type de classe.
- Choisir le thread de livraison : principal (UI), arrière-plan ou post-thread.
- Utiliser des priorités d'abonnés et l'annulation d'événements.
Exemple d'utilisation d'EventBus
Considérons un exemple simple : le composant SensorManager génère des événements de changement de température, et deux autres composants — Logger et AlertSystem — y réagissent.
Étape 1 : Définition de l'événement
L'événement est une classe Java ordinaire contenant des données :
public class TemperatureEvent { private final double temperature; private final String sensorId;
public TemperatureEvent(double temperature, String sensorId) { this.temperature = temperature; this.sensorId = sensorId; }
public double getTemperature() { return temperature; } public String getSensorId() { return sensorId; }}Étape 2 : Création des abonnés
Les abonnés s'enregistrent auprès de l'EventBus et marquent les méthodes de gestion avec l'annotation @Subscribe :
import org.greenrobot.eventbus.EventBus;import org.greenrobot.eventbus.Subscribe;
public class Logger { public void start() { EventBus.getDefault().register(this); }
@Subscribe public void onTemperatureEvent(TemperatureEvent event) { System.out.println("[LOG] Capteur " + event.getSensorId() + " : la température est de " + event.getTemperature() + "°C"); }
public void stop() { EventBus.getDefault().unregister(this); }}
public class AlertSystem { private static final double A Aussi dans la bibliothèque
Géolocalisation et cartes en Go (Golang) : bibliothèques et exemples de code
ORM pour Rust : comparaison et exemples d'utilisation de Diesel, SeaORM et SQLx
Génération de PDF en PHP : bibliothèques, outils et exemples de code