【问题标题】:Model View synchronisation (or avoiding synchronisation)模型视图同步(或避免同步)
【发布时间】:2009-04-07 07:38:11
【问题描述】:

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

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

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

由 JTextComponent 描绘的这一信息既存储在 JTextComponent 文档中,也存储在域对象模型中。这种组织导致模型的这种信息被复制。因此这两个模型需要保持同步。违反 DRY。

是否有任何优雅的解决方案可以将 JTextComponent(或任何图形组件)绑定到域对象模型的一部分,从而真正将数据放在一个位置?

【问题讨论】:

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


    【解决方案1】:

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

    然后使用setDocument(d) method

    【讨论】:

    • 或者一个接受 Document 的构造函数。
    【解决方案2】:

    这里发生了几件事。

    Java 框架为您提供了一种更新 UI 的好方法,但限制您使用特定的结构 Document。

    另一方面,您有一个充分的模型来代表您的数据。通过在模型中直接使用 Document,您还冒着将模型绑定到特定框架的风险。这不是一个好主意。

    Java 文档框架提供了侦听更改的功能,您可以利用它在模型和文档之间创建Adapter class。基本上,当您设置表单时,您将创建适配器类的实例。您将使用您的模型进行初始化。适配器将具有返回文档的属性。此外,适配器会将自己注册为该文档模型的侦听器。适配器将足够聪明,知道如何将文档模型的机会转换为您的模型。

    是这样的

    1. UI 与 JTextDocument。
    2. 在创建过程中它请求 视图中的模型。
    3. 它创建一个适配器实例 使用您的模型对其进行初始化。
    4. 适配器还将自身设置为 Document 的监听器。
    5. 将文档分配给 JTextDocument 对象。
    6. 与文档的任何交互都是 报告给适配器
    7. 适配器通知视图 将翻译后的数据传回。
    8. 视图改变了模型。
    9. 视图通知适配器 模型发生了变化。
    10. 适配器翻译更改 更改文档。

    由于适配器与 Java 框架相关联,因此应将其推送到尽可能靠近 UI 的位置。适配器可能会实现视图公开的接口,以便视图不必引用任何特定于您正在使用的框架的内容。当您更改框架时,您所要做的就是创建一个实现该接口的新对象,而 View 再聪明不过了。

    【讨论】:

      【解决方案3】:

      如果我理解正确,您将面临平行的收容层级。

      enter code here
                         view  -----------------------> Model
                           |
                           v
                       TextArea------------------------>Document
      

      您担心的是模型中的数据也需要存在于文档中。解决这个问题的最优雅的方法是将文档从模型本身中移除,即使文档成为整个模型的窗口。

      我认为 Yuval 提出了同样的建议。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-06
        • 2012-12-04
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多