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

JavaFX中ObservableList的使用是否违反了模型-视图-控制器分离?,java,model-view-controller,arraylist,javafx,observablelist,Java,Model View Controller,Arraylist,Javafx,Observablelist,我正在尝试研究JavaFX,因为我想将它用作我程序的GUI。我的问题本质上是一个概念性问题: 到目前为止,我的程序主要是MVC模式的“模型”部分;也就是说,我的几乎所有代码都是类意义上抽象的OO表示,并且所有代码都是逻辑代码 因为我不想成为我程序的唯一用户,所以我想添加MVC的“视图”部分,这样人们就可以轻松地使用和操作我程序的“模型”部分。为此,我想使用JavaFX 在我的“模型”类中,我显然使用了来自Java Collections API的各种列表、映射和其他类。为了让我的程序的用户操作这

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

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

因为我不想成为我程序的唯一用户,所以我想添加MVC的“视图”部分,这样人们就可以轻松地使用和操作我程序的“模型”部分。为此,我想使用JavaFX

在我的“模型”类中,我显然使用了来自Java Collections API的各种列表、映射和其他类。为了让我的程序的用户操作这些底层列表和映射,我想使用JavaFX中的可观察(列表/映射)接口

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

假设我有一个MachineMonitor类,每3分钟检查一台机器的某些属性,例如连接是否仍然良好,齿轮转动的速度,等等。如果满足某些不平等条件(例如齿轮的速度下降到1转/秒),MachineMonitor将启动RestartMachineeEvent

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

为了跟踪程序的用户想要做什么(比如,为Machine#5创建一个MachineMonitor,检查齿轮的转动/秒是否低于0.5),我使用ObservableList作为TableView的基础列表

链接程序的“模型”和“视图”最简单的方法就是将“模型”类更改为有一个ObservableList而不是ArrayList,但是(说到问题的主题)我觉得这非常混乱,因为它混合了“模型”和“视图”代码

一种幼稚的方法是对TableView使用ObservableList,并保留对ArrayList的使用。但是,根据JavaFX规范,对ObservableList所做的更改不会影响基础列表

有鉴于此,解决这个难题的最佳方法是为ObservableList创建一个ChangeListener,将对ObservableList所做的更改“传播”到底层的“模型”ArrayList?也许把它放在一个叫做MachineMonitorController的类中

这种临时解决方案看起来非常混乱和不理想


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

我不同意在“模型”类中使用
可观察列表违反MVC分离。
可观察列表
纯粹是数据表示;它是模型的一部分,而不是视图的一部分。I()。除此之外,我还指出了如何使用(或至少可以)绑定到JSF的JavaFX属性。(我应该提到,并不是所有人都同意在服务器端使用FX属性的方法;但是,我真的看不到任何方法可以证明它们是视图的一部分。)

还有,如果你有

List<MachineMonitor> myNonObservableList = ... ;

ObservableList<MachineMonitor> myObservableList = FXCollections.observableList(myNonObservableList);
myObservableList.add(new MachineMonitor());
List mynonobserveList=;
ObservableList myObservableList=FXCollections.ObservableList(MyNonServableList);
myObservableList.add(新的MachineMonitor());

可观察列表由不可观察列表支持,因此更改也发生在
myNonObservableList
中。因此,如果您愿意,可以使用这种方法。

简单地说,我不认为使用ObservableList会破坏MVC合同

剩下的,你可以随意阅读,也可以不阅读,因为它太长了

建筑图案背景

在MVC风格的体系结构中非常有用,因为它们提供了一种通过松散耦合在MVC组件之间来回反馈数据的方法,其中模型和视图类不需要直接相互引用,而是可以与一些共享数据模型一起工作,该模型传递数据流。可观察模式和MVC风格的架构概念几乎同时起源于施乐PARC,这并不是巧合——两者是相互联系的

如中所述,有许多不同的方法来构建GUI。MVC只是其中的一个,有点像他们的祖父。很好地理解MVC(这经常被误解)是很好的,MVC概念在很多地方都是适用的。对于您的应用程序,您应该使用最适合您的系统,而不是严格遵循给定的模式(除非您使用的是强制实施给定模式的特定框架),并且还应该开放地在应用程序中采用不同的模式,而不是试图将所有内容硬塞进单个概念框架中

JavaBean是几乎所有Java程序的基本部分。虽然传统上只在客户端应用程序中使用,但observer模式(通过
PropertyChangeListeners
)自创建以来一直是应用程序的一部分。JavaFX的可观察和绑定元素是早期工作的翻版,从中学习构建更方便使用和更容易理解的东西。也许,如果JavaFX可观察和绑定元素作为JDK的一部分在十年或十二年前就已经存在,那么这些概念将比两个纯GUI框架更广泛地用于各种库和框架中

建议

我建议考虑应用程序和其他GUI架构

如果你想要一个完全简单的框架,它遵循模型、视图和演示者的风格,那么一定要做一个旋转

我认为架构的正确选择取决于您的应用