给定软件系统的整体结构是模型视图控制器。 视图(图形界面)是模型的表示(域对象模型)。
但是,在视图(图形界面)中有组件(例如JTextComponent)。这些组件也安排在模型视图控制器中。 JTextComponent使用Document作为其模型。
JTextComponent旨在表示域对象模型的特定部分。但它的模型实际上是Document对象。
由JTextComponent描述的这条信息存储在JTextComponent文档和域对象模型中。该组织导致模型的此信息被复制。因此这两个模型需要保持同步。违反DRY。
是否有任何优雅的解决方案将JTextComponent(或任何图形组件)绑定到域对象模型的一部分,因此数据确实有一个位置?
答案 0 :(得分:2)
在对象模型中创建自己的Document
对象。
答案 1 :(得分:1)
如果我理解正确,你将面临并行的遏制等级。
enter code here
view -----------------------> Model
|
v
TextArea------------------------>Document
您担心的是Model中的数据也需要出现在Document中。解决这个问题的最优雅方法是将Document从模型本身驱逐出去,即将Document作为整个模型的窗口。
我认为Yuval暗示同样的事情。
答案 2 :(得分:1)
这里有几件事情。
Java框架为您提供了更新UI的好方法,但限制您使用特定的结构Document。
另一方面,您有足够的模型来表示您的数据。通过在模型中直接使用Document,您还可以将模型绑定到特定框架。这不是一个好主意。
Java Document框架提供了收听更改的功能,您可以利用这些更改在模型和Document之间创建Adapter class。基本上,当您设置表单时,您将创建适配器类的实例。您将使用您的模型进行初始化。适配器将具有返回文档的属性。此外,适配器将自己注册为该文档模型的侦听器。适配器将足够智能,知道如何将文档模型的机会转换为您的模型。
这样的事情
因为适配器与Java Framework绑定,所以应尽可能靠近UI推送适配器。可能适配器将实现View公开的接口,以便View不必引用您正在使用的框架的任何特定内容。当您更改框架时,您所要做的就是创建一个实现该接口的新对象,而View则不是更明智的。