Вопрос

Я пишу приложение Swing и, кроме того, мой предыдущий вопрос, решили использовать Модель-Представление-Презентатор шаблон для отделения пользовательского интерфейса от бизнес-логики.

Когда мое приложение запускается, оно выполняет следующий код:

Model model = new BasicModel();
Presenter presenter = new Presenter(model);
View view = new SwingView(presenter);
presenter.setView(view);

presenter.init();

который создает пользовательский интерфейс.События генерируются View, и делегирован PresenterPresenter затем манипулирует 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 класс.«Модель» приложения качания может быть «деревом» отдельных «модельных» классов, которые имеют общий «корень».

Итак, в вашем случае вам нужно

«Глобальная» модель -> (содержит) модель «Предпочтения».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top