小编典典

JavaFX中ObservableList的使用是否违反了模型-视图-控制器的分隔?

java

我正在尝试研究JavaFX,因为我想将其用作程序的GUI。我的问题本质上是一个概念性的问题:

到目前为止,我的程序主要是MVC模式的“模型”部分。也就是说,从类的意义上讲,几乎所有我的代码都是抽象的OO表示,而所有这些代码都是逻辑代码。

由于我不想成为程序的唯一用户,因此我想添加MVC的“视图”部分,以便人们可以轻松使用和操纵程序的“模型”部分。为此,我想使用JavaFX。

在我的“模型”类中,我显然使用了Java Collections
API中的各种List,Map和其他类。为了让程序的用户能够操纵这些底层的列表和映射,我想使用JavaFX中的Observable(List /
Map)接口。

一个具体的例子可以使情况变得清晰:

假设我有一个 MachineMonitor
类,该类每3分钟检查一次Machine的某些属性,例如连接是否仍然良好,齿轮旋转的速度等。如果满足某些不等式(例如,齿轮下降到1转/秒的速率)
MachineMonitor 触发RestartMachineEvent。

当前,我使用ArrayList < MachineMonitor >跟踪所有单独的 MachineMonitor
。现在扩展到MVC的“视图”部分,我希望用户能够操纵显示 MachineMonitor 列表的TableView,以便他们可以例如创建和删除新的
MachineMonitor 来监视各种计算机。

为了跟踪程序用户的 意图 (例如,为5号机器创建一个 MachineMonitor
,以检查齿轮的转数/秒是否低于0.5),我使用了ObservableList < MachineMonitor >作为TableView的基础列表。

链接程序的“模型”和“视图”的最简单方法是将“模型”类更改为具有ObservableList < MachineMonitor

而不是ArrayList < MachineMonitor >,但是(进入问题的主题)我觉得这很混乱,因为它混合了“模型”和“视图”代码。

天真的方法是将ObservableList < MachineMonitor >用于TableView并保留对ArrayList <
MachineMonitor >的使用。但是,根据JavaFX规范,对ObservableList < MachineMonitor

所做的更改不会影响基础列表。

鉴于此,是为了解决这一难题,以便为ObservableList <一个ChangeListener的最佳方式 MachineMonitor

该“传播”更改到ObservableList <制成 MachineMonitor >到底层“模型”的ArrayList <
MachineMonitor >?也许将其放在名为MachineMonitorController的类中?

这种临时解决方案似乎非常混乱且不理想。

我的问题是:在这种情况下,保持“模型”和“视图”之间几乎完全分离的最佳方法是什么?


阅读 215

收藏
2020-11-01

共1个答案

小编典典

我不同意ObservableList在您的“模型”类中使用会违反MVC分离。An
ObservableList纯粹是数据表示;它是模型的一部分,而不是视图的一部分。我(
其他人在应用程序所有层的模型表示中使用JavaFX属性和集合。在其中的其他内容中,我指出了如何使用(或至少可以)绑定到JSF的JavaFX属性。(我应该提一下,并不是每个人都同意在服务器端使用FX属性的方法;但是,我真的看不到有任何方法可以使它们成为视图的一部分)。

另外,如果你这样做

List<MachineMonitor> myNonObservableList = ... ;

ObservableList<MachineMonitor> myObservableList = FXCollections.observableList(myNonObservableList);
myObservableList.add(new MachineMonitor());

可观察列表由不可观察列表支持,因此也会发生更改myNonObservableList。因此,您可以根据需要使用此方法。

2020-11-01