El patrón Observer usando el mecanismo de extracción

7

Me preguntaba sobre la siguiente implementación de

public void update(Observable obs, Object arg)

mientras quiero enviar a todo mi observador y actualizar usando notifyObserver() i y pasar referencias a this , el observador puede usar el getters del sujeto para obtener la información que desea.

¿para qué sirve el argumento arg en el método de actualización?

    
pregunta USer22999299 15.08.2014 - 11:46

1 respuesta

9

Al implementar el patrón Observer, hay dos enfoques principales a considerar: el modelo 'push' y el modelo 'pull'.

En el modelo 'push', el sujeto (es decir, el Observable) envía al observador en la notificación todos los datos que necesitará. El observador no necesita consultar al sujeto para obtener información. En el modelo 'pull', el sujeto simplemente notifica al observador que algo sucedió, y el observador consulta al sujeto para obtener la información que necesita.

Discutamos las ventajas y desventajas de ambos enfoques:

Push

La principal ventaja del modelo 'push' es el menor acoplamiento entre el observador y el sujeto. El observador no necesita saber nada sobre el tema para poder consultarlo. Si fuera necesario, deberíamos hacer una de las siguientes acciones: A- hacer downcasting en el lado del observador para invocar métodos get específicos de la clase en el tema. Esto es malo. B- hace que la interfaz Observable sea más específica para cada clase, que ofrece métodos específicos get , lo que hace que la relación entre el observador y el sujeto sea menos general y haga que las cosas sean más copuladas.

Al implementar el modelo 'push', evitamos todo esto.

Sin embargo, la desventaja es menos flexibilidad: es posible que el sujeto no siempre sepa qué información exacta necesitan los observadores para poder enviarla. Esto a menudo significará interfaces de usuario más específicas, como AgeObserver que se notifican cuando cambia la 'edad' del sujeto, y HeightObserver a las que se envía el height actual del sujeto en la notificación.

Esta es una opción. El otro es el sujeto que envía una gran cantidad de información encapsulada en un objeto Info de algún tipo y hace que los observadores la consulten desde allí. Pero una vez más, no podemos estar seguros de que estamos enviando la información correcta. Así que es esto, o obligar a los observadores a implementar interfaces de Observador más específicas, lo que aprieta el acoplamiento en el lado del observador.

Pulso

Ya noté las desventajas del modelo 'pull'. Los observadores tendrían que saber cosas sobre el tema para consultar la información correcta, lo que lleva a A- a hacer un downcasting (feo), o B- favorablemente a interfaces Observable más específicas, que ofrecen métodos de acceso más específicos. Por ejemplo, AgeObservable ofrece un método getAge() .

La ventaja de esto es más flexibilidad. Cada observador puede decidir por sí mismo qué consultar, sin confiar en el tema para enviar la información correcta.

Debes elegir la estrategia que sea mejor para el proyecto específico en el que estás trabajando.

En realidad, siempre tendrás las interfaces específicas Observer y Observable , así que de todas formas tienes algún acoplamiento entre los lados.

Por lo tanto, elija 'tirar' o 'empujar' según lo que más le convenga.

¿Todos los AgeObserver s necesitan simplemente el age de la materia? Implementar el modelo 'push'. Menos acoplamiento y más simple.

¿Todos los HeightObserver s necesitan información variable sobre el tema, al igual que uno necesita consultar la edad también, y algún otro objeto necesita consultar el peso además de la altura? Implementar el modelo 'pull'. Esto te obligaría a agregar accesores (getters) a la interfaz Observable (esto o pasar el objeto real como un parámetro en su tipo explícito, pero hacerlo a través de la interfaz te permite negar a los observadores el acceso a cosas que no lo hacen). t importa para ellos). Esta alma crea un acoplamiento más alto, pero es más flexible.

Elija lo que mejor se adapte a su situación.

    
respondido por el Aviv Cohn 15.08.2014 - 12:07

Lea otras preguntas en las etiquetas