Observer – Patrones de Diseño
Antonio Leiva

El patrón de diseño Observer es uno de los patrones más populares y utilizados en la programación orientada a objetos.

Este patrón permite que un objeto, conocido como «sujeto», notifique a sus «observadores» cuando sucede un cambio en su estado.

Por ejemplo, imaginemos que tenemos una aplicación de mensajería que notifica a los usuarios cuando reciben un nuevo mensaje.

En este caso, el sujeto sería el mensaje y los observadores serían los usuarios que están suscritos a ese mensaje.

Cuando se recibe un nuevo mensaje, el sujeto notifica a todos sus observadores y éstos pueden actualizar su interfaz de usuario para mostrar el nuevo mensaje.

En Kotlin, podemos implementar el patrón Observer utilizando interfaces y clases genéricas.

Por ejemplo, podríamos tener una interfaz llamada Observable que define los métodos necesarios para agregar y eliminar observadores, así como para notificar a los observadores cuando se produce un cambio en el estado del sujeto.

interface Observable<T> {
    fun addObserver(observer: Observer<T>)
    fun removeObserver(observer: Observer<T>)
    fun notifyObservers()
}

También tendríamos una interfaz llamada Observer que define un método para actualizar el estado del observador cuando se produce un cambio en el sujeto.

interface Observer<T> {
    fun update(data: T)
}

Luego, podríamos implementar nuestro sujeto, por ejemplo una clase Message que implementa la interfaz Observable y mantiene una lista de observadores.

class Message(var content: String) : Observable<Message> {
    private val observers = mutableListOf<Observer<Message>>()

    fun setContent(content: String) {
        this.content = content
        notifyObservers()
    }

    override fun addObserver(observer: Observer<Message>) {
        observers.add(observer)
    }

    override fun removeObserver(observer: Observer<Message>) {
        observers.remove(observer)
    }

    override fun notifyObservers() {
        observers.forEach { it.update(this) }
    }
}

Por último, podríamos implementar nuestros observadores, por ejemplo una clase User que implementa la interfaz Observer y muestra el nuevo mensaje cuando se produce un cambio en el sujeto.

class User(var name: String) : Observer<Message> {
    override fun update(data: Message) {
        println("Nuevo mensaje para $name: ${data.content}")
    }
}

Para utilizar estas clases, podríamos crear un mensaje y agregar usuarios como observadores. Cuando se modifique el contenido del mensaje, se notificará a los observadores y éstos podrán mostrar el nuevo contenido en su interfaz de usuario.

val message = Message("Hola mundo")
val user1 = User("Juan")
val user2 = User("Ana")

message.addObserver(user1)
message.addObserver(user2)

message.setContent("¿Cómo estás?")

En este ejemplo, se imprimiría en la consola:

Nuevo mensaje para Juan: ¿Cómo estás?
Nuevo mensaje para Ana: ¿Cómo estás?

De esta manera, el patrón Observer nos permite notificar a múltiples observadores cuando se produce un cambio en el estado de un sujeto, permitiendo una comunicación eficiente entre objetos en nuestro código.

Conclusión

En resumen, el patrón Observer es una técnica muy útil en la programación orientada a objetos que permite que un objeto notifique a sus observadores cuando se produce un cambio en su estado.

Esto nos permite implementar una comunicación eficiente entre objetos en nuestro código, lo que nos permite diseñar sistemas más flexibles y adaptables.

En Kotlin, podemos implementar el patrón Observer utilizando interfaces y clases genéricas. Por ejemplo, podemos tener una interfaz Observable que define los métodos necesarios para agregar y eliminar observadores, así como para notificar a los observadores cuando se produce un cambio en el estado del sujeto.

También podemos tener una interfaz Observer que define un método para actualizar el estado del observador cuando se produce un cambio en el sujeto. Luego, podemos implementar nuestro sujeto y nuestros observadores utilizando estas interfaces.

Este patrón es muy útil en aplicaciones que requieren notificaciones en tiempo real, como por ejemplo aplicaciones de mensajería, redes sociales o sistemas de alertas.

Además, es un patrón muy utilizado en la programación concurrente ya que permite notificar a los observadores de manera segura y eficiente.

En conclusión, el patrón Observer es una herramienta muy útil en la programación orientada a objetos y en Kotlin podemos implementarlo de manera sencilla y eficiente utilizando interfaces y clases genéricas.

Quizá también te interese…

Las reglas FIRST de los tests

Las reglas FIRST de los tests

Las reglas FIRST son un conjunto de principios que se utilizan para diseñar y escribir tests de software de manera efectiva. Las siglas FIRST significan: F - Fast: Un test debe ser rápido de ejecutar. I - Independent: Un test debe ser independiente de otros tests y...

¿Qué son los dobles de test?

¿Qué son los dobles de test?

Los dobles de prueba (también conocidos como "doubles" o "fakes") son herramientas comunes en la programación y en particular en el testing de software. Se utilizan para simular el comportamiento de una dependencia de una aplicación en un entorno de pruebas, sin tener...

Kata del TicTacToe en Kotlin

Kata del TicTacToe en Kotlin

Escribe el código para representar una entidad que almacene el tablero de juego del 3 en raya, y que además tenga: Un método move() con 2 parámetros, fila y columna, que permita añadir un movimiento al tablero Un método findWinner(), que devuelva el ganador (X, Y o...

0 comentarios

Enviar un comentario

Los datos personales que proporciones a través de este formulario quedarán registrados en un fichero de DevExpert, S.L.U., con el fin de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento de la parte interesada. Si no se acepta, no podrás comentar en este blog. Los datos que proporciona solo se utilizan para evitar el correo no deseado y no se usarán para nada más. Puede ejercer los derechos de acceso, rectificación, cancelación y oposición en contacto@devexperto.com.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acepto la política de privacidad *