Применение шаблона MVP к JDialogs
-
21-08-2019 - |
Вопрос
Я пишу приложение Swing и, кроме того, мой предыдущий вопрос, решили использовать Модель-Представление-Презентатор шаблон для отделения пользовательского интерфейса от бизнес-логики.
Когда мое приложение запускается, оно выполняет следующий код:
Model model = new BasicModel();
Presenter presenter = new Presenter(model);
View view = new SwingView(presenter);
presenter.setView(view);
presenter.init();
который создает пользовательский интерфейс.События генерируются View
, и делегирован Presenter
.А Presenter
затем манипулирует Model
и обновляет View
соответственно.
Чтобы обработать некоторые события, мне нужно получить дополнительную информацию от пользователя.Я считаю, что в случае этих событий уместно, чтобы представление Swing порождало новое JDialog
окно.
Одна мысль заставляет меня почувствовать, что это может быть подходящий код в исходном коде. Presenter
:
public void handlePreferences() {
Preferences prefs = view.getPreferences();
model.setPreferences(prefs);
}
То есть содержимое каждого JDialog
должен представлять собой отдельный объект, который должен быть получен из View
и обновлен в Model
.Однако остается вопрос:мне создать новый Model
представлять Preferences
объект и новый Presenter
для обработки событий в этом JDialog
?
Мне кажется, что создание нового Presenter
и Model
внутренний по отношению к оригиналу View
заставляет меня делать много работы, которую было бы сложнее портировать, если бы я захотел изменить пользовательский интерфейс, например, для использования JSF.
Пожалуйста, не стесняйтесь добавлять комментарии для пояснения.
Решение
Хотя нередко встречаются «вложенные» шаблоны проектирования, в вашем случае это не обязательно.Опираясь на другие ответы:
Модель
- Содержит все реальные данные, переменные, объекты
- знает, как установить новые значения сохраненных данных
- отвечает на приказы (вызовы методов)
- имеет метод setPreferences(value1,value2,value3...);
Вид
- это ввод-вывод для приложения, просто вывод и ввод
- оно может работать только над собой, над своим состоянием
- он поддерживает локальные переменные и объекты, например.у него есть JButtons, JMenus, счетчики int...
- умеет сообщать Ведущему об изменении состояния
- его состояние видно презентатору или раскрывается при вызове метода
- отвечает на приказы (вызовы методов)
- умеет получать предпочтения от пользователя
- имеет метод AskForPrefs();
- имеет метод getPrefState();
Ведущий
- Реагирует на изменения состояния
- принимает все решения, сообщает другим объектам, что делать (а не как это делать)
- знает, когда нужны предпочтения
- знает, где взять новые предпочтения и куда их поставить
- имеет метод newPrefsAvailable();
...для получения дополнительной информации от пользователя.Я считаю, что в случае этих событий уместно, чтобы представление Swing создавало новое окно JDialog.
Ведущий — проверяет модель, определяет, что требуются новые предпочтения.
Ведущий — this.myView.askForPrefs();// сообщает представлению, что нужно запросить у пользователя заданные значения
View.askForPrefs — отображает окно JDialog, retVals сохраняется в представлении как изменение состояния.
Просмотр — this.myPresenter.newPrefsAvailable();
Presenter — отвечает this.myModel.setPreferences (this.myView.getPrefState());
Model.setPreferences — изменяет сохраненные значения на View.getPrefState().
Ведущий — проверяет модель — определяет, что предпочтения хорошие.
Ведущий – продолжает
JDialog рассматривается как расширение представления, он является членом представления, как и JButton.Модель имеет авторитетные фактические значения предпочтений, а представление имеет локальные переменные, которые представляют состояние JDialog.
Другие советы
Мой совет — подумать о том, в чем суть этих «предпочтений».Являются ли они частью базовой бизнес-логики?Если да, то они должны быть частью структуры модели.Определяют ли они предпочтительный способ взаимодействия пользователя с бизнес-данными?Тогда они должны быть частью представления.Это может показаться теоретическим, но, по моему опыту, это в конечном итоге избавляет от многих головных болей.
Если вы не можете это понять, то место сохранения настроек даст вам еще одну подсказку.если их необходимо сохранить вместе с обрабатываемыми данными, то они, вероятно, являются частью бизнес-логики.Если они сохранены в файле личных настроек пользователя, то это не так, и их следует считать просмотренными.
Нет, вам не нужна другая «модель» только для предпочтений.
Просто передайте презентатора и режим в качестве аргументов конструктору JDialog.Легче программировать большое приложение Swing, когда есть
- 1 модель
- 1 контроллер (который сам может содержать контроллеры меньшего размера)
- несколько представлений (но для ОДНЫХ классов данных/моделей)
Обратите внимание, что 1 модель != 1 класс.«Модель» приложения качания может быть «деревом» отдельных «модельных» классов, которые имеют общий «корень».
Итак, в вашем случае вам нужно
«Глобальная» модель -> (содержит) модель «Предпочтения».