Oop 我们认为MVVM(应用于JavaFX)的模型是什么?

Oop 我们认为MVVM(应用于JavaFX)的模型是什么?,oop,javafx,mvvm,Oop,Javafx,Mvvm,我对如何在JavaFX中组织代码有点困惑(假设我打算采用MVVM的方式) 考虑标准4层体系结构的下图: MVVM中的“模型”在哪里?它是在“用户界面”层内还是在“应用程序/域层”上?我可以想象MVVM的模型是后端模型的一种表示(投影),适合当前视图,但从我在网上看到的情况来看,我并不确定 例如: 我有一个简单的冰淇淋应用程序。其应用层公开了以下方法: IceCreamService.iceCreams():列表 IceCreamService.flavors(冰淇淋:字符串):列表 用户界

我对如何在JavaFX中组织代码有点困惑(假设我打算采用MVVM的方式)

考虑标准4层体系结构的下图:

MVVM中的“模型”在哪里?它是在“用户界面”层内还是在“应用程序/域层”上?我可以想象MVVM的模型是后端模型的一种表示(投影),适合当前视图,但从我在网上看到的情况来看,我并不确定

例如:

我有一个简单的冰淇淋应用程序。其应用层公开了以下方法:

  • IceCreamService.iceCreams():列表
  • IceCreamService.flavors(冰淇淋:字符串):列表
用户界面将有一个带有冰淇淋列表的组合框,并根据用户选择允许他选择一些口味。然后有一个按钮来提交订单

问题是:

我们认为这里的模型是什么?这是我们称之为模型的
IceCreamService
,还是模型将是我们在UI级别创建的由属性/可观察对象组成的类?如果是后者,谁负责用数据填充此模型?“控制器”(ViewModel)或者它应该足够聪明,可以自己做(也就是说,它引用了
IceCreamService
?)


谢谢

MVC及其派生的设计模式总是有“10个人会找到12种方法来实现它”的问题,所以我将简要地指出一些“流行的”实现

到目前为止,仍然常见的是,您的“用户界面”肯定映射到MVVM中的“视图”。从现在开始,这就有点争议了

模型是大脑 实现MVVM的一种流行方式是“视图模型”是整个应用程序的大脑。在本例中,“应用程序”映射到“ViewModel”,而“域”类型映射到“Model”。ViewModel控制(并决定)获取数据的内容和方式,以及要向视图公开的内容和方式。大多数时候,“Model”只是一个普通的POJO类(例如,
IceCream
class)

对于JavaFX,您可以让模型和ViewModel中的所有属性由某种
属性
实现(即实现该接口的东西)表示。如果您没有使用类似“mvvmFX”的API,则视图中的属性很可能会绑定到ViewModel中的其他属性。如果您使用的是“mvvmFX”(我没有使用),那么您(很可能)将通过属性名称(WPF就是这样做的)将视图属性绑定到ViewModel

在这种方法中,ViewModel负责获取冰淇淋列表<代码>冰淇淋服务
可以被视为一个单独的
服务
层,或者您可以假设它是ViewModel的一部分(它本身不是ViewModel,但它属于ViewModel)。如果要更新此列表,则由ViewModel决定

作为域的模型 另一个实现是使模型进行数据管理,这与hibernate在春季所做的非常相似。模型类继续表示数据(或实体等),但它有自己的持久性逻辑。这意味着,如果您更新模型对象的值(例如,更改
冰淇淋
实例的味道),模型将知道它是“脏的”,并将更改推送到存储库中

MVCVM 我还读到另一篇文章。简言之,它与第一种方法类似,但它将
IceCreamService
类移动到一个名为“Controller”的全新层中

你的榜样 根据您的示例,这是一个示例,演示了如何在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.
class IceCreamSelectionView{//用作MVVM视图类的FXML控制器类
@FXML组合盒冰淇淋;
@FXML组合盒口味;
private final IceCreamSelectionViewModel vm;//对应的ViewModel
@FXML私有void initialize(){
Bindings.bindContent(iceCreams.getItems(),vm.getIceCreams());
Bindings.bindContent(flavors.getItems(),vm.getFlavors());
vm.selectedecreamproperty().bind(iceCreams.valueProperty());
vm.selectedFlavorProperty().bind(flavors.valueProperty());
}
}
类别IceCreamSelectionViewModel{
/*
*属性
*/
公共最终观察列表getIceCreams(){返回冰激凌;}
公共最终可观察列表getFlavors(){return flavors;}
public final StringProperty selectedecreamproperty(){return selectedecream;}
公共最终StringProperty selectedFlavorProperty(){返回selectedFlavor;}
私有updateicreams(){
iceCreams.setAll(iceCreamService.getIceCreams());
}
}
//没有模型类,因为“冰激凌”和“味道”都不能进一步分解。

Hi。谢谢你的长篇大论!我提出的问题是:在遵循六边形体系结构的现代应用程序中(例如),将发生的是,层(基础设施/域/应用程序)将是给定的,并且只是由某个团队来构建一个或多个前端(图上的“用户界面”),在此基础上(它们可以是桌面ui、REST API、网站或rabbit mq API接口等)我的问题是,从这个角度来看,事情会如何展开?FXML是视图的一部分,当然,那么控制器仍然会被视为视图的一部分,再加上ViewModel将连接到底层?另一个问题:ViewModel是否应该完全与UI控件无关?这对fol来说是一个很好的启发吗低?@EngluseDelysum如果您使用的是使用Spring的RESTful,那将是一种MVC设计。在我看来,所有连接到web服务的客户端都将是MVC设计中的“视图”。然后,如果您计划使用JavaFX作为前端来使用web服务,那么您可以使用MVVM设计