Event Bus y el patrón Observer en Kotlin: implementación y ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Event Bus y el patrón Observer en Kotlin: arquitectura de aplicaciones orientadas a eventos



El desarrollo moderno en Kotlin, especialmente en el contexto de Android y aplicaciones de servidor, requiere mecanismos flexibles de interacción entre componentes. El patrón Observer y su implementación práctica — Event Bus — proporcionan una solución elegante para una arquitectura débilmente acoplada, donde un objeto (editor) notifica a múltiples suscriptores sobre la ocurrencia de un evento, sin conocer su implementación específica. En este artículo, analizaremos cómo construir tu propio Event Bus en Kotlin, utilizando corrutinas y tipado seguro.



Patrón Observer: base teórica



El patrón Observer (Observador) define una dependencia de "uno a muchos" entre objetos. Cuando el estado del sujeto (editor) cambia, todos los objetos dependientes (observadores) son notificados y actualizados automáticamente. En Kotlin, este patrón se puede implementar mediante interfaces, lambdas o construcciones más avanzadas.



Elementos clave del patrón:

  • Subject (Sujeto) — objeto que gestiona la lista de observadores y envía notificaciones.
  • Observer (Observador) — objeto que recibe notificaciones del sujeto.
  • ConcreteSubject — implementación concreta del sujeto con su propio estado.
  • ConcreteObserver — implementación concreta del observador que reacciona a los cambios.


Ejemplo de una implementación simple en Kotlin:



interface Observer {    fun update(event: String)}

class ConcreteSubject { private val observers = mutableListOf<Observer>()

fun attach(observer: Observer) { observers.add(observer) }

fun detach(observer: Observer) { observers.remove(observer) }

fun notifyObservers(event: String) { observers.forEach { it.update(event) } }}

class ConcreteObserver(private val name: String) : Observer { override fun update(event: String) { println("$name recibió el evento: $event") }}

fun main() { val subject = ConcreteSubject() val observer1 = ConcreteObserver("Observador 1") val observer2 = ConcreteObserver("Observador 2")

subject.attach(observer1) subject.attach(observer2) subject.notifyObservers("Datos actualizados")}


Event Bus: bus de eventos práctico



Event Bus es un mecanismo centralizado que extiende el patrón Observer. En lugar de que cada sujeto gestione sus propios observadores, se crea un bus único a través del cual pasan todos los eventos. Esto simplifica la comunicación entre componentes, especialmente en aplicaciones complejas.



Ventajas de Event Bus:

  • Bajo acoplamiento: los editores y suscriptores no se conocen entre sí.
  • Facilidad para agregar nuevos suscriptores sin modificar el código existente.
  • Posibilidad de filtrar eventos por tipo o etiqueta.
  • Soporte para procesamiento asíncrono mediante corrutinas.


Implementación de Event Bus en Kotlin con corrutinas



Una implementación moderna de Event Bus debe considerar la concurrencia y evitar fugas de memoria. El uso de Coroutines y Channel permite crear un bus seguro para hilos y eficiente.



Implementación básica de Event Bus:



import kotlinx.coroutines.*import kotlinx.coroutines.channels.Channelimport kotlinx.coroutines.flow.*

sealed class Event { data class UserLoggedIn(val userId: String) : Event() data class DataUpdated(val data: String) : Event() object NetworkError : Event()}

class EventBus { private val _events = MutableSharedFlow<Event>(extraBufferCapacity = 64) val events: SharedFlow<Event> = _events.asSharedFlow()

suspend fun publish(event: Event) { _events.emit(event) }

fun subscribe(scope: CoroutineScope, action: (Even

Recommendations