gpt4 book ai didi

oop - 我们认为模型与 MVVM(应用于 JavaFX)的关系是什么?

转载 作者:行者123 更新时间:2023-12-03 10:22:15 24 4
gpt4 key购买 nike

我对如何在 JavaFX 中组织代码有点困惑(假设我打算采用 MVVM 方式)。
考虑下图的标准 4 层架构:
enter image description here
MVVM 中的“模型”在哪里?它是在“用户界面”层内还是在“应用程序/域层”上?我会想象 MVVM 的模型是适合当前 View 的后端模型的表示(投影),但我不确定我在网上看到的情况。
举个例子:
我有一个简单的冰淇淋应用程序。它的应用层公开了这些方法:

  • IceCreamService.iceCreams(): List<String> ;
  • IceCreamService.flavours(iceCream: String): List<String> .

  • UI 将有一个带有冰淇淋列表的组合框,并且基于用户的选择将允许他选择一些口味。然后有一个按钮来提交订单。
    问题是:
    我们认为这里的模型是什么?这是 IceCreamService我们称之为模型或模型将是我们在 UI 级别创建的由属性/可观察对象组成的类?如果是后者,谁负责用数据填充这个模型? “ Controller ”(ViewModel)或者它应该足够聪明来自己做(也就是说,它有对 IceCreamService 的引用?)
    谢谢!

    最佳答案

    MVC 及其衍生设计模式总是存在“10 个人会找到 12 种实现方式”的问题,所以我将简要指出一些“流行”的实现方式。
    到目前为止,常见的是您的“用户界面”肯定映射到 MVVM 中的“ View ”。然后从这里开始有点争议。
    ViewModel 是大脑
    实现 MVVM 的一种流行方式是“ViewModel”是整个应用程序的大脑。在这种情况下,“Application”映射到“ViewModel”,“Domain”映射到“Model”。 ViewModel 控制(并决定)获取数据的内容和方式,以及它想要向 View 公开的内容和方式。大多数时候“模型”只是一个普通的 POJO 类(例如 IceCream 类)。
    对于 JavaFX,您可以让 Model 和 ViewModel 中的所有属性由某种 Property 表示。实现(即实现该接口(interface)的东西)。如果您没有使用“mvvmFX”之类的 API,那么您的 View 很可能会将属性绑定(bind)到 ViewModel 中的其他属性。如果您使用的是“mvvmFX”(我没有使用),那么您(很可能)将通过属性名称将 View 属性绑定(bind)到 ViewModel(这是 WPF 所做的)。
    在这种方法中,ViewModel 负责获取冰淇淋列表。 IceCreamService可以被认为是一个单独的Service层,或者您可以假设它是 ViewModel 的一部分(它本身不是 ViewModel,但它属于 ViewModel)。如果您想更新此列表,则由 ViewModel 决定。
    模型作为域
    另一种实现是让模型进行数据管理,很像hibernate在Spring中所做的。模型类继续表示数据(或实体等),但它带有自己的持久性逻辑。这意味着如果您更新模型对象的值(例如更改 IceCream 实例的风格),模型将知道它是“脏的”,并将更改推送到例如存储库。
    MVCVM
    我还读到了另一个 approach .简而言之,它类似于第一种方法,但它移动了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.

    关于oop - 我们认为模型与 MVVM(应用于 JavaFX)的关系是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54174578/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com