Event Bus y el patrón Observer en Java: cómo construir una arquitectura de eventos flexible
En el desarrollo moderno de Java, a menudo surge la necesidad de notificar a unos componentes del sistema sobre acciones que ocurren en otros, sin crear una dependencia rígida entre ellos. El clásico patrón Observer resuelve este problema, pero su implementación manual puede provocar un crecimiento del código, fugas de memoria y dificultades en la depuración. Aquí es donde entra en juego el Event Bus — una implementación lista del patrón "publicador-suscriptor" (Publish-Subscribe), que se encarga de la gestión de suscripciones y la entrega de eventos.
En este artículo, analizaremos en detalle qué es un Event Bus, cómo se relaciona con el patrón Observer y mostraremos un ejemplo práctico del uso de la popular biblioteca greenrobot EventBus para aplicaciones Java. Este material será útil para desarrolladores que deseen crear sistemas débilmente acoplados, fáciles de probar y escalables.
Patrón Observer: el fundamento del Event Bus
El patrón Observer define una relación de "uno a muchos" entre objetos: cuando un objeto (el publicador) cambia su estado, todos los objetos que dependen de él (los suscriptores) son notificados automáticamente. En la implementación clásica, el publicador almacena una lista de suscriptores y llama a sus métodos directamente.
Desventajas de la implementación manual:
- Acoplamiento fuerte: el suscriptor debe implementar explícitamente la interfaz Observer.
- Gestión del ciclo de vida: es necesario cancelar la suscripción manualmente, de lo contrario pueden ocurrir fugas de memoria.
- Dificultad de escalado: a medida que crece el número de suscriptores, el código se vuelve difícil de mantener.
El Event Bus resuelve estos problemas actuando como un mediador central. El publicador no conoce a los suscriptores — simplemente envía el evento al bus. El bus mismo encuentra a todos los suscriptores registrados para ese tipo de evento y les entrega el mensaje.
Conociendo greenrobot EventBus
EventBus de greenrobot es una biblioteca ligera para Java y Android que implementa el patrón Observer utilizando anotaciones. Permite:
- Enviar eventos de cualquier tipo (clases POJO).
- Suscribirse a eventos por tipo de clase.
- Elegir el hilo de entrega: principal (UI), en segundo plano o post-hilo.
- Usar prioridades de suscriptores y cancelación de eventos.
Ejemplo de uso de EventBus
Consideremos un ejemplo simple: el componente SensorManager genera eventos sobre cambios de temperatura, y otros dos componentes — Logger y AlertSystem — reaccionan a ellos.
Paso 1: Definición del evento
El evento es una clase Java común que transporta datos:
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; }}Paso 2: Creación de suscriptores
Los suscriptores se registran en EventBus y marcan los métodos manejadores con la anotación @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] Sensor " + event.getSensorId() + ": temperature is " + event.getTemperature() + "°C"); }
public void stop() { EventBus.getDefault().unregister(this); }}
public class AlertSystem { private static final double A También en la biblioteca
Trabajo con Apache Kafka en Go (Golang): bibliotecas y ejemplos
Trabajo con CSV en Kotlin: bibliotecas y ejemplos de código
Trabajo con imágenes en Go (Golang): bibliotecas y ejemplos
Planificador de tareas en C# (.NET): Quartz.NET, Hangfire, Coravel