2012-04-18 16 views
19

Vengo a Java desde el mundo C# donde el patrón Observer se implementa como una construcción de lenguaje de primera clase con la palabra clave event.Alternativa a la clase observable de Java?

Veo que Java tenía la clase Observable desde los primeros días, pero claramente tiene problemas de implementación y no parece ser ampliamente utilizado. Hasta ahora, he estado implementando mi propio patrón Observer en mi código Java, pero no puedo evitar pensar que debe haber una mejor alternativa que desarrollar siempre este código repetitivo. Existen las clases de Escucha en Swing pero no parecen apropiadas para códigos que no sean Swing.

¿Cuál es la solución recomendada para este problema tan común? Las bibliotecas de terceros están bien conmigo.

+0

¿Por qué las clases de oyentes no son apropiadas para el código que no es Swing? – Jeffrey

+0

Parece que todas las interfaces y clases derivadas de EventListener están en los paquetes Swing y AWT. Como están en un paquete que es responsable de la IU, usarlos para la IU no me parece mal. ¿Los EventListeners se usan fuera de estos contextos de IU? – HolySamosa

+3

¿Quién puede impedirte obtener tus propias clases de oyente? 'EventListener' y' EventObject' están ambos en 'java.util', no están obligados a AWT o Swing de ninguna manera. – Jeffrey

Respuesta

17

Por lo general, el patrón de observador se implementa con una solución ad-hoc cuando sea necesario. Cuando se trata de patrones de comportamiento, es uno de los más simples: dos métodos para controlar una lista de "observadores" y un método que notifica a los observadores cuando sucede algo interesante.

El patrón de observador tiende a surgir con demasiada poca frecuencia fuera de ciertos dominios, y cuando surge, tiende a ser demasiado específico para el dominio de la aplicación, por lo que las soluciones genéricas tienen poco valor. Se puede ver el problema con la clase java.util.Observable: si se hereda de Observable usted tiene que aceptar todos los tipos posibles de "observador" que se puede pasar a usted, lo que probablemente no tiene sentido para su aplicación:

  • ¿Qué pasa si su objeto puede producir dos tipos diferentes de eventos, y por lo tanto necesita dos listas diferentes de observadores?
  • ¿Qué sucede si los observadores pueden influir en su objeto según el evento, p. al poder vetar un cambio?

Dicho esto, EventBus from Google Guava parece hacer un buen trabajo al simplificar la producción y el manejo de eventos adoptando un enfoque radicalmente diferente.

Otro techniques based on annotations have been discussed on SO antes.

+0

Gracias por la respuesta. No estoy seguro de que su afirmación sobre las soluciones de observadores genéricos sea de poco valor, aunque puedo ver que ese argumento se aplica a la implementación de Observer de Java. Para volver a mostrar C#, Observer es un ciudadano de primera clase en su construcción 'event' que se usa mucho en .NET. Creo que el observador genérico solo debe implementarse correctamente, y tal vez sea el caso de que realmente se necesite una construcción de lenguaje para llevarlo a cabo. – HolySamosa

+1

Sí, se necesita una construcción de lenguaje.Por ejemplo, si tiene 'N' diferentes tipos de eventos, la clase tiene que ser aumentada con' N' conjuntos de métodos para gestionar eventos oyentes. Pero una biblioteca de lenguaje Java no puede agregar una cantidad arbitraria de métodos a las clases donde se usa. – Joni

+0

problema principal que tuvimos con el utilitario. El enfoque GoF obsoleto u original es que en una aplicación grande, el enhebrado, el punto muerto y el rendimiento se vuelven locos. convertimos nuestra aplicación con el enfoque de bus uniforme –

4

This article muestra una buena implementación del patrón utilizando Spring Framework. Aún necesita definir las interfaces de Sujeto y Observador (y las implementaciones), pero Spring maneja el registro del Observador a Sujetos a través de la configuración XML.

5

Recomiendo mirar en reactive programming. Java solo tiene una implementación que conozco: reactive4java.

+0

Excelente sugerencia, gracias. Recientemente comencé a usar Reactive Extensions en mi desarrollo de C# y es bastante impresionante. – HolySamosa

Cuestiones relacionadas