在 JavaFX 中使用 ObservableList 是否违背了 Model-View-Controller 分离?
我正在尝试研究JavaFX,因为我想将其用作程序的GUI。我的问题本质上是一个概念问题:
到目前为止,我的程序主要是MVC模式的“模型”部分;也就是说,我几乎所有的代码都是类意义上的抽象的OO表示,所有这些代码都是逻辑代码。
由于我不想成为我的程序的唯一用户,我想添加MVC的“视图”部分,以便人们可以轻松使用和操作我的程序的“模型”部分。为此,我想使用JavaFX。
在我的“模型”类中,我显然使用各种列表,映射和Java集合API中的其他类。为了让我的程序的用户操作这些底层的列表和映射,我想在JavaFX中使用Observable(List/Map)接口。
一个具体的例子来澄清这种情况:
假设我有一个MachineMonitor类,每3分钟检查一次机器的某些属性,例如连接是否仍然良好,齿轮转动的速度等。如果满足某些不等式(例如齿轮的速度已降至1转/秒),MachineMonitor将触发RestartMachineEvent。
目前,我使用ArrayList<MachineMonitor>来跟踪所有单个MachineMonitor的。现在扩展到MVC的“视图”部分,我希望用户能够操作显示MachineMonitor列表的TableView,以便他们可以创建和删除新的MachineMonitor来监视各种机器。
为了让我可以跟踪程序的用户想要做什么(例如,为机器#5创建一个MachineMonitor,检查齿轮的转弯/秒是否低于0.5),我使用ObservableList<MachineMonitor>作为TableView的基础列表。
链接我的程序的“模型”和“视图”的最简单方法是简单地将“Model”类更改为具有ObservableList<MachineMonitor>而不是ArrayList<MachineMonitor>但是(进入问题的主题)我觉得这非常混乱,因为它混合了“模型”和“视图”代码。
一种幼稚的方法是对 TableView 使用 ObservableList<MachineMonitor>,并保留使用我的 ArrayList<MachineMonitor>。但是,根据 JavaFX 规范,对 ObservableList<MachineMonitor>所做的更改不会影响基础列表。
鉴于此,解决这个难题的最佳方法是为 ObservableList<MachineMonitor>制作一个 ChangeListener,它将对 ObservableList<MachineMonitor>所做的更改“传播”到底层的“模型”ArrayList<MachineMonitor>?也许把它放在一个名为MachineMonitorController的类中?
这种临时解决方案似乎非常混乱且不理想。
我的问题是:在这种情况下,保持“模型”和“视图”之间几乎完全分离的最佳方法是什么?