Я пытаюсь изучить JavaFX, потому что я хочу использовать его в качестве графического интерфейса моей программы. Мой вопрос по существу концептуальен:
На сегодняшний день моя программа в основном представляет собой "модельную" часть шаблона MVC; то есть почти весь мой код является OO-представлением абстракций в смысле классов, и весь этот код является логическим кодом.
Поскольку я не хочу быть единственным пользователем моей программы, я хочу добавить часть "Просмотр" MVC, чтобы люди могли легко использовать и манипулировать частью "Модели" моей программы. Для этого я хочу использовать JavaFX.
В моих классах "Model" я, очевидно, использую различные списки, карты и другие классы из API коллекций Java. Чтобы пользователи моей программы могли манипулировать этими базовыми списками и картами, я хочу использовать интерфейсы Observable (List/Map) в JavaFX.
Конкретный пример, обеспечивающий ясность ситуации:
Скажем, что у меня есть класс MachineMonitor, который каждые 3 минуты проверяет определенные свойства машины, например, если соединение все еще хорошо, скорость вращения шестеренок и т.д. Если определенные неравенства выполняются (скажем, что скорость передач снизилась до скорости 1 оборот/с) MachineMonitor запускает RestartMachineEvent.
В настоящее время я использую ArrayList < MachineMonitor > , чтобы отслеживать все индивидуальные MachineMonitor. Теперь, перейдя к части "Просмотр" MVC, я хочу, чтобы Пользователь мог управлять TableView, который отображает список MachineMonitor s, чтобы они могли, например, создавать и удалять новые MachineMonitor для мониторинга различных машин.
Итак, я могу отслеживать, что хочет сделать пользователь моей программы (скажем, создать MachineMonitor для машины № 5, которая проверяет, падает ли оборот/сек передач ниже 0.5) Я использую ObservableList < MachineMonitor > в качестве основного списка для TableView.
Самый простой способ связать "Модель" и "Вид" моей программы - просто изменить класс "Модель", чтобы иметь ObservableList < MachineMonitor > , а не ArrayList < MachineMonitor > но (попадание в тему вопроса) Я чувствую, что это очень грязно, потому что он смешивает код "Model" и "View".
Наивный подход заключается в использовании ObservableList < MachineMonitor > для TableView и сохранения использования моего ArrayList < MachineMonitor > . Однако изменения, внесенные в ObservableList < MachineMonitor > , не влияют на базовый список в соответствии со спецификациями JavaFX.
Учитывая это, лучший способ решить эту загадку, чтобы сделать ChangeListener для ObservableList < MachineMonitor > , который "распространяет" изменения, внесенные в ObservableList < MachineMonitor к базовому "Model" ArrayList < MachineMonitor > ? Возможно, поместите это в класс под названием MachineMonitorController?
Это ad-hoc решение кажется очень грязным и не идеальным.
Мой вопрос: что является лучшим способом сохранить почти полное разделение между "Моделью" и "Вид" в этом сценарии?