MVC и его производные шаблоны проектирования всегда имеют проблему «10 человек найдут 12 способов ее реализовать», поэтому я бы кратко указал на несколько «популярных» реализаций.
Пока что общим остается то, что ваш «Пользовательский интерфейс» определенно отображается на «Вид» в MVVM. Тогда это становится немного спорным с этого момента.
ViewModel - это мозг
Одним из популярных способов реализации MVVM является то, что ViewModel - это мозг всего приложения. В этом случае «Приложение» отображается на «ViewModel», а «Домен» - на «Модель». ViewModel контролирует (и решает), что и как получить данные, а также что и как он хочет предоставить представлению. В большинстве случаев «Модель» - это простой класс POJO (например, IceCream
класс).
Для JavaFX вы бы позволили всем свойствам в Model и ViewModel быть представлены какой-то реализацией Property
(то есть чем-то, что реализует этот интерфейс). Если вы не используете API, такой как «mvvmFX», то, скорее всего, ваш View будет иметь свойства, связанные с другими свойствами в ViewModel. Если вы используете «mvvmFX» (который я не использовал), то вы (скорее всего) привязали бы свойства View к ViewModel через имя свойства (что и делает WPF).
При таком подходе ViewModel отвечает за получение списка мороженого. IceCreamService
можно рассматривать как отдельный Service
слой, или вы можете предположить, что он является частью ViewModel (он сам не является ViewModel, но он принадлежит ViewModel). Если вы хотите обновить этот список, именно ViewModel решит это.
Модель как домен
Другая реализация заключается в том, чтобы заставить Model управлять данными, во многом как в hibernate в Spring. Модельные классы продолжают представлять данные (или объекты и т. Д.), Но имеют собственную логику персистентности Это означает, что если вы обновите значение объекта Model (например, изменит вкус экземпляра IceCream
), модель узнает, что он «грязный», и отправит изменение в хранилище, например.
MVCVM
Я также читал о другом подходе . Короче говоря, он похож на первый подход, но он перемещает класс IceCreamService
в совершенно новый слой под названием «Контроллер».
Ваш пример
На основе вашего примера это пример, иллюстрирующий, как это может быть реализовано в JavaFX.
class IceCreamSelectionView { // The FXML controller class used as MVVM View class
@FXML ComboBox<String> iceCreams;
@FXML ComboBox<String> flavors;
private final IceCreamSelectionViewModel vm; // The corresponding ViewModel
@FXML private void initialize() {
Bindings.bindContent(iceCreams.getItems(), vm.getIceCreams());
Bindings.bindContent(flavors.getItems(), vm.getFlavors());
vm.selectedIceCreamProperty().bind(iceCreams.valueProperty());
vm.selectedFlavorProperty().bind(flavors.valueProperty());
}
}
class IceCreamSelectionViewModel {
/*
* The properties
*/
public final ObservableList<String> getIceCreams() { return iceCreams; }
public final ObservableList<String> getFlavors() { return flavors; }
public final StringProperty selectedIceCreamProperty() { return selectedIceCream; }
public final StringProperty selectedFlavorProperty() { return selectedFlavor; }
private updateIceCreams() {
iceCreams.setAll(iceCreamService.getIceCreams());
}
}
// There is no Model class because both "iceCream" and "flavor" cannot be further broken down.