Ответственность за создание экземпляров в MVP - PullRequest
5 голосов
/ 30 марта 2012

При разработке приложения с архитектурой MVP у меня возник вопрос о создании экземпляров представления. В моем случае докладчик должен быть полностью отделен от просмотра, чтобы можно было легко менять наборы инструментов для пользовательского интерфейса. Пока есть только одна точка зрения, все ясно. Моя проблема возникает, когда необходимо динамически создавать представления. Например, при нажатии новой кнопки всплывающее диалоговое окно с просьбой заполнить некоторые данные. Я пришел с двумя решениями, но мне любопытно о других. Ниже приведен пример кода моих подходов.

  1. Давайте в родительском представлении создать экземпляр диалогового окна и вернуть его родительскому презентатору, где также создан экземпляр диалога. Мне не нравится идея, что конкретное представление должно создавать другое представление. У меня такое ощущение, что создание экземпляров не является обязанностью зрения.

    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. Введите фабрику предъявителю. Эта фабрика отвечает за мгновенный просмотр. Существует некоторая проблема с передачей родительского представления в диалоговое представление (обычно это требуется для каркасов GUI). Также есть довольно большое количество настроек.

    // 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;
      }
    }
    

Что вы думаете об ответственности за создание нового докладчика и просмотр? Я ищу практический пример подхода других людей. Спасибо за ваши предложения.

1 Ответ

0 голосов
/ 18 апреля 2012

В моем случае я фактически никогда не создаю представления (включая диалоги).Я предполагаю, что в любой момент времени не может быть более одного диалога, поэтому я использую GIN для создания экземпляров и введения диалогов в презентатор.Затем докладчику просто нужно изменить атрибуты в диалоговом окне (включая обработчики) и показать его.Это позволяет мне управлять созданием всех представлений (и докладчиков) в одном месте с помощью GIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...