El patrón del observador usando el mecanismo de tracción


10

Me preguntaba sobre la siguiente implementación de

public void update(Observable obs, Object arg)

mientras que quiero enviar a todo mi observador y actualizar usando notifyObserver()I y pasarle referencias al thisobservador, puedo usar el gettersdel sujeto para obtener la información que desea.

¿Para qué sirve el argargumento sobre el método de actualización?


@RBT arges un parámetro o grupo de parámetros, como una opción adicional
umlcat

Respuestas:


11

Al implementar el patrón Observador, 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 el tema para obtener información. En el modelo 'pull', el sujeto simplemente notifica al observador que algo sucedió, y el observador consulta al sujeto en función de obtener la información que necesita.

Analicemos los pros y los contras de ambos enfoques:

empujar

La principal ventaja del modelo 'push' es un menor acoplamiento entre el observador y el sujeto. El observador no necesita saber nada sobre el tema para consultarlo. Si fuera necesario, tendríamos que hacer una de las siguientes acciones: A- hacer downcasting al lado del observador para invocar getmétodos específicos de clase sobre el tema. Esto es malo. B- hace que la Observableinterfaz sea más específica para la clase, ofreciendo getmétodos específicos , haciendo así que la relación entre el observador y el sujeto sea menos general y haciendo las cosas más copuladas.

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

Sin embargo, la desventaja es una menor flexibilidad: es posible que el sujeto no siempre sepa qué información exacta necesitan los observadores para enviársela. Esto a menudo significará interacciones de observador más específicas, como las AgeObserverque se notifican cuando se cambia la 'edad' del sujeto y a las HeightObserverque se envía la corriente heightdel sujeto en la notificación.

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

Halar

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

La ventaja de esto es una mayor flexibilidad. Cada observador puede decidir por sí mismo qué consultar, sin depender del tema para enviar la información correcta.


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

En realidad, siempre tendrá intefaces Observery específicos Observable, por lo que de todos modos tendrá un poco de acoplamiento entre los lados.

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

¿Todos AgeObservernecesitan simplemente ageel tema? Implemente el modelo 'push'. Menos acoplamiento y más simple.

¿Todos los HeightObservers necesitan información variada sobre el tema, también conocido como uno necesita consultar la edad también, y algún otro objeto necesita consultar el peso además de la altura? Implemente el modelo 'pull'. Esto lo obligaría a agregar accesores (getters) a la Observableinterfaz (ya sea esto o pasar el objeto real como parámetro en su tipo explícito, pero hacerlo a través de la interfaz le permite negar a los observadores el acceso a cosas que no importan). ellos). Esta almación crea un mayor acoplamiento, pero es más flexible.

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


Gracias por esta explicacion. Volviendo a mi pregunta, como dijiste mientras usaba pull, necesito lanzar y usar getters, pero ¿para qué sirve el método de actualización del observador? - actualización pública nula (Obs observable, Objeto arg)?
USer22999299

No estoy seguro, pero creo que Object argestá destinado al modelo 'push', donde argse envía un 'paquete de información' al observador.
Aviv Cohn

Sí, esto es lo que estaba pensando también, pero ¿por qué enviamos a la obstetra? :) si eliminamos el contenido, podemos obtener la información que necesitamos.
USer22999299

1
¿Estás hablando de 'empujar' o 'tirar'? La idea en 'push' es que el observador no necesita saber sobre el tipo de sujeto. Por lo tanto, evitas el vaciado. El lanzamiento hacia abajo es principalmente malo porque crea un acoplamiento más estrecho entre los dos lados: el observador ahora sabe el tipo exacto del sujeto, que supera todo el propósito. ¿Qué pasa si luego una nueva clase implementa la Observableinterfaz? Si no confía en el tipo concreto del sujeto, es decir, al no hacer el downcasting, el código de observador actual funcionará igual de bien, polimórficamente, con el nuevo sujeto.
Aviv Cohn

1
Si su código de observador se basa en la conversión descendente, deberá cambiar con cada nueva clase que implemente la interfaz Observable, lo que anulará todo el propósito del patrón. Este es un ejemplo de por qué 'programar en una interfaz, no una implementación concreta' es algo bueno: el código que funciona en una interfaz funcionará sin cambios con cada nueva clase que implemente la interfaz. Si confía en la implementación concreta, por ejemplo, haciendo downcasting, su código deberá cambiar con cada nueva clase Observable. Superando todo el propósito.
Aviv Cohn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.