
En este octavo y último paso del tutorial Spring Vaadin Hibernate vamos a centrarnos en el patrón MVP (Modelo – Vista – Presentador), que es el que hemos elegido seguir tanto en el proyecto de ejemplo como en nuestro proyecto real.
¿En qué consiste el patrón MVP?
Este patrón es una derivación del patrón MVC (Modelo – Vista – Controlador), separando la lógica de negocio de la interfaz de usuario y consiguiendo así un desacoplamiento de cada una de las partes. Cuenta con los siguientes elementos:
- Modelo: donde se lleva a cabo toda la lógica de negocio.
- Vista: es la encargada de mostrar los datos obtenidos del modelo e informar al presentador de las acciones ejecutadas por el usuario. Por otro lado, obtiene del presentador los datos actualizados procedentes del modelo, modificando el contenido de los componentes gráficos (campos de texto, desplegables, botones…).
- Presentador: es el encargado de escuchar los eventos que se producen en la vista y ejecutar las acciones necesarias a través del modelo.
La ventaja más importante del patrón MVP es la facilidad que nos ofrece para testear nuestra aplicación, ya que dado que hemos separado de forma clara nuestra interfaz en estos tres elementos, la creación de tests puede realizarse de una manera bastante más sencilla.
Ejemplo de MVP en nuestra aplicación
Vamos a coger de ejemplo la clase AddressBrowser. Esta clase es nuestra vista, la cual tendrá un presentador inyectado, AddressBrowserPresenter. Como hemos comentado antes, es la encargada de visualizar los componentes gráficos y de llamar al presentador cuando se requiera ejecutar lógica de negocio (acciones, llamadas a base de datos…). Por ejemplo, la acción de eliminar un item y actualizar el componente Grid (método deleteItemAndUpdateGrid):
1 2 3 4 5 6 7 8 9 10 |
@Component(AddressBrowser.BEAN_NAME) @Scope("prototype") public class AddressBrowser extends AbstractBrowser { @Autowired private AddressBrowserPresenter addressBrowserPresenter; public void deleteItemAndUpdateGrid() throws UIException { addressBrowserPresenter.deleteItemAndUpdateGrid(gridBrowser); } |
A continuación vemos nuestro presentador, AddressBrowserPresenter. En él se definen todas las acciones que necesiten lógica de negocio de la aplicación, como son las llamadas a los servicios. Siguiendo el ejemplo, se realiza la llamada al método delete del servicio addressService inyectado para eliminar un item del Grid. Tras llamar al servicio correspondiente, el propio presentador se encarga de invocar a los métodos de la vista adecuados para refrescar los componentes gráficos o, si ha habido errores en la ejecución, lanzar una excepción para mostrarle el error al usuario.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@Component @Scope("session") public class AddressBrowserPresenter extends AbstractBrowserPresenter { @Autowired private IAddressService addressService; public void deleteItemAndUpdateGrid(IGridBrowser gridBrowser) throws UIException { try{ addressService.delete(((AddressDTO) gridBrowser.getSelectedGridRow()).getId()); gridBrowser.deleteEntry(); gridBrowser.updateGrid(); } catch (Exception err){ throw new UIException("Error deleting entry", err); } } |
Y por último, en nuestro modelo se implementa la lógica de la aplicación, que en este caso podemos ver representada en la implementación del método delete de la clase ServiceAddressImpl.
1 2 3 4 |
@Override public void delete(Object id) { addressRepository.delete((Integer) id); } |
Conclusiones
- El presentador es el intermediario entre la vista y el modelo. Lo que nos permite que cualquiera de las dos pueda ser sustituida sin que la otra se vea afectada, consiguiendo una separación completa entre la parte visual y la lógica de negocio de la aplicación.
- La vista no conoce el modelo, por lo que es fácilmente testeable.
- El presentador es independiente de la interfaz de usuario, por lo que también es fácilmente testeable.
¡Con este último paso damos por finalizado nuestro tutorial de Spring – Vaadin – Hibernate!
Muchas gracias por seguirnos y por vuestras consultas. Cualquier duda que tengan no duden en escribirnos un comentario y estaremos encantados de solucionarlas. Además recuerden que todo el código desarrollado para este tutorial lo pueden encontrar en: https://github.com/mhpes/svh-simple-crud-tutorial.
¡Un saludo!