Al diseñar la aplicación con la arquitectura MVP, surgió una pregunta sobre la creación de instancias de la vista. En mi caso, el presentador debe estar completamente separado de la vista para poder cambiar fácilmente los juegos de herramientas de la interfaz de usuario. Mientras haya una sola vista, todo está claro. Mi problema surge cuando existe la necesidad de crear vistas dinámicamente. Por ejemplo, cuando se hace clic en un nuevo botón emergente emergente de diálogo pidiéndole al usuario que complete algunos datos. Vengo con dos soluciones, pero siento curiosidad por los demás. Le doy un código de muestra debajo de mis enfoques.Responsabilidad de instanciar la vista en MVP
Vamos a la vista principal para crear una instancia de la vista de diálogo y devolverla al presentador principal, donde el presentador de diálogo también creará una instancia. No me gusta la idea de que una vista concreta deba instanciar otra vista. Tengo la sensación de que la creación de instancias no es responsabilidad de la vista.
public interface View { public void setPresenter(Presenter presenter); public void showView(); } public interface NewDialogView implements View { /* ommited ordinary getters/setters for view */ } public interface MainWindowView implements View { /* ommited ordinary getters/setters for view */ public NewDialogView createNewDialog(); } public interface Presenter { public View getView(); } public class NewDialogPresenter implements Presenter { protected NewDialogView view; public MainWindow(NewDialogView view) { this.view = view; this.view.setPresenter(this); } public View getView() { return view; } } public class MainWindowPresenter implements Presenter { protected MainWindowView view; public MainWindow(MainWindowView view) { this.view = view; this.view.setPresenter(this); } public void newButtonClicked() { NewDialogView newDialogView = view.createNewDialog(); // too much responsibility? NewDialogPresenter newDialogPresenter = new NewDialogPresenter(newDialogView); newDialogView.showView(); /* then let's NewDialogPresenter deal with user input */ } public View getView() { return view; } }
fábrica Inyectar al presentador. Esta fábrica es responsable de la vista de creación de instancias. Hay algún problema al pasar la vista principal a la vista de diálogo (generalmente los marcos de GUI lo necesitan). También hay una cantidad bastante grande de configuración.
// Just presenter approach differs and there is no create method in view interface. public interface MainWindowView implements View { /* ommited ordinary getters/setters for view */ } public class MainWindowPresenter implements Presenter { protected MainWindowView view; protected NewDialogViewFactory newDialogViewFactory; public MainWindow(MainWindowView view) { this.view = view; this.view.setPresenter(this); } public void newButtonClicked() { NewDialogView newDialogView = newDialogViewFactory.createNewDialog(view); // should pass a parent view here or not? NewDialogPresenter newDialogPresenter = new NewDialogPresenter(newDialogView); newDialogView.showView(); // then let's NewDialogPresenter deal with user input } public View getView() { return view; } public void setNewDialogViewFactory(NewDialogViewFactory newDialogViewFactory) { this.newDialogViewFactory = newDialogViewFactory; } }
¿Cuál es su opinión acerca de la responsabilidad para crear una instancia nueva presentadora y ver? Estoy buscando ejemplos prácticos de otras personas. Gracias por sus sugerencias.
echa un vistazo a [esta publicación] (http://stackoverflow.com/questions/3309029/mvp-should-the-view-implement-a-presenters-interface-or-vice-versa) y vea si ayuda. –