2012-03-30 10 views
6

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

  1. 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; 
        } 
    } 
    
  2. 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.

+0

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. –

Respuesta

1

En mi caso, en realidad nunca creo vistas (incluidos los cuadros de diálogo). Asumo que nunca puede haber más de un diálogo presente en cualquier momento, así que uso GIN para crear instancias e inyectar diálogos en el presentador. El presentador solo necesita cambiar los atributos en el cuadro de diálogo (incluidos los controladores) y mostrarlo. Esto me permite administrar la creación de todas las vistas (y presentadores) en un solo lugar usando GIN.

+0

Gracias por su respuesta. El problema es que las diferentes bibliotecas de IU tienen una administración de memoria diferente. Por lo tanto, a veces el diálogo debe eliminarse después de cerrado, a veces actúa como singleton y simplemente se vuelve a mostrar una y otra vez. Quiero separar esto de la lógica de presentación. –