pattern - ¿Alternativa a la clase observable de Java?
spring observer pattern (3)
Llego 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 del event
.
Veo que Java tuvo la clase Observable
desde los primeros días, pero claramente tiene problemas de implementación y no parece ser ampliamente utilizado. Hasta ahora solo he estado implementando el patrón Observer en mi código Java, pero siempre puedo evitar pensar que debe haber una mejor alternativa para obtener siempre este código repetitivo. Hay clases de oyentes en Swing pero no parecen apropiadas para el código que no es de Swing.
¿Cuál es la solución recomendada para este problema tan común? Las bibliotecas de terceros están bien conmigo.
Por lo general, el patrón de observador se implementa con una solución ad-hoc siempre que 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 ocurre algo interesante.
El patrón de observador tiende a surgir con 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. Puede ver el problema con la clase java.util.Observable
: si hereda de Observable
, tiene que aceptar todos los tipos posibles de "observador" que se le pueden pasar, lo que probablemente no tenga 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é pasa si los observadores pueden influir en su objeto dependiendo del evento, por ejemplo, al poder vetar un cambio?
Dicho esto, EventBus de Google Guava parece hacer un trabajo bastante bueno al simplificar la producción y el manejo de eventos al adoptar un enfoque radicalmente diferente.
Otras técnicas basadas en anotaciones se han discutido en SO antes.
Recomiendo mirar en programación reactiva . Java tiene solo una implementación que conozco: reactive4java .
Este artículo muestra una buena implementación del patrón usando Spring Framework. Aún necesita definir sus interfaces de Sujeto y Observador (e implementaciones), pero Spring maneja el registro de Observador a Sujetos mediante la configuración XML.