模型视图同步(或避免同步)

时间:2009-04-07 07:38:12

标签: java model-view-controller design-patterns

给定软件系统的整体结构是模型视图控制器。 视图(图形界面)是模型的表示(域对象模型)。

但是,在视图(图形界面)中有组件(例如JTextComponent)。这些组件也安排在模型视图控制器中。 JTextComponent使用Document作为其模型。

JTextComponent旨在表示域对象模型的特定部分。但它的模型实际上是Document对象。

由JTextComponent描述的这条信息存储在JTextComponent文档和域对象模型中。该组织导致模型的此信息被复制。因此这两个模型需要保持同步。违反DRY。

是否有任何优雅的解决方案将JTextComponent(或任何图形组件)绑定到域对象模型的一部分,因此数据确实有一个位置?

3 个答案:

答案 0 :(得分:2)

在对象模型中创建自己的Document对象。

然后使用setDocument(d) method

答案 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。基本上,当您设置表单时,您将创建适配器类的实例。您将使用您的模型进行初始化。适配器将具有返回文档的属性。此外,适配器将自己注册为该文档模型的侦听器。适配器将足够智能,知道如何将文档模型的机会转换为您的模型。

这样的事情

  1. UI与。一起创建 JTextDocument。
  2. 在请求的创建过程中 来自View的模型。
  3. 它创建适配器的实例 用你的模型初始化它。
  4. 适配器也将自己设置为 文件的听众。
  5. 将文档分配给 JTextDocument对象。
  6. 与文档的任何交互都是 报告回适配器
  7. 适配器通知视图 将翻译后的数据传回去。
  8. 视图更改模型。
  9. View无法使用适配器 模型有变化。
  10. 适配器转换更改  对文件的更改。
  11. 因为适配器与Java Framework绑定,所以应尽可能靠近UI推送适配器。可能适配器将实现View公开的接口,以便View不必引用您正在使用的框架的任何特定内容。当您更改框架时,您所要做的就是创建一个实现该接口的新对象,而View则不是更明智的。