2010-07-28 22 views
7

Hola a todos, actualmente estoy trabajando en una aplicación Java Swing y estaba buscando alguna guía. La aplicación es bastante pequeña, pero me doy cuenta de que a medida que la base de código se hace más grande, tengo un montón de acoplamiento en mi gráfico de objetos. Soy relativamente nuevo en Swing, pero he estado programando lo suficiente como para saber hacia dónde se dirige.Patrones de diseño para reducir el acoplamiento en la aplicación Swing

El mayor problema que estoy teniendo es la creación de mi manejo de eventos. ¿Cómo deberían mis ventanas y objetos secundarios comunicar eventos a mis objetos de nivel superior sin tener referencias sobre ellos? He hecho una buena cantidad de codificación web MVC. ¿Este patrón se presta bien a Swing? ¿Debo estar construyendo mi propio controlador? Supongo que solo estoy buscando patrones que a la gente le haya resultado útil para trabajar con Swing.

Gracias de antemano por su ayuda.

+0

Véase también http://stackoverflow.com/questions/3072979 – trashgod

Respuesta

5

La mejor manera de reducir el acoplamiento en una interfaz gráfica de usuario, creo, es el uso de un bus de eventos. Existen varias implementaciones existentes, incluidas algunas compatibles con Swing específicamente.

Sólo google for swing event bus y encontrará.

Si usa Guice en su GUI, también le recomendamos echar un vistazo a guts-events.

+0

Gracias, esto es lo que estaba buscando una API para proporcionar un bus de mensajería a través de la aplicación. . Miré en guts-event y http://www.eventbus.org/. Creo que voy a ir con el último. – BillMan

+0

Está bien, he utilizado EventBus en el pasado y no tuve que quejarme Sin embargo, recuerdo que en algunas versiones, el uso de anotaciones para los consumidores del evento podría perder memoria; no sé si esto se ha solucionado en la última versión. – jfpoilpret

0

Como ya se ha dicho que su intención de utilizar MVC, o puede ser que ya utilizan. Una vez que haya separado los datos (lo llamo capa de modelo de datos). Ahora necesita aplicar el patrón OBSERVER en estas clases de modelo de datos. Todas las vistas (sus componentes ui) que utilizan este modelo de datos están observando los objetos de este modelo para cualquier cambio (a través del patrón de observador).

espero que esto es lo que busca.

1

Otro patrón que podría ser interesante para usted es el MVP (Modelo Vista Presentador) -pattern. Esto es ideal para acoplar puntos de vista más vagamente al modelo. Una buena explicación de Todd Snyder se puede encontrar en here.

0

MVC !!! Luego puede usar también una variante de Observer llamada Publish/Subscribe para implementar el flujo de eventos dentro de su aplicación.

0

No estoy de acuerdo con la gente que sugieren utilizar Event bus, porque

  • causa de código como EventBus.subscribe(SymbolListChangeEvent.class, this); toda su código dependerá de una instancia de bus único evento que hace que sea muy difícil de probar,
  • es difícil averiguar dónde se utiliza un evento específico.

En lugar de eso, sugiero que se utilicen interfaces para encapsular las dependencias externas de un módulo. Si lo desea, puede usarlos con el patrón del oyente, pero en general puede refaccionarlo todo si lo desea.

+0

Event Bus no significa necesariamente que el bus sea una clase sin interfaz, ¿Por qué reclamas eso? En el caso de las agallas-eventos, incluso Los canales t son interfaces, que se inyectan donde sea necesario (por Guice), por lo que se pueden burlar fácilmente para las pruebas. – jfpoilpret

+0

Para el segundo punto, estoy de acuerdo, pero usted tendría el mismo tipo de problema con otros enfoques. En mi experiencia, he mantenido sistemáticamente un documento (con una lista de eventos, es decir, productores y consumidores) actualizado para que el mantenimiento sea más fácil. – jfpoilpret

+0

Por cierto, ¿qué enfoque sugiere si no le gusta la solución Event Bus? – jfpoilpret