【问题标题】:Using MVC, how should one handle communication between Views? Between Models?使用 MVC,应该如何处理 View 之间的通信?模型之间?
【发布时间】:2010-09-18 16:19:55
【问题描述】:

在我实现 MVC 之前,我寻求正确理解 MVC 的第三个问题:

我想到了两种情况:

  1. 主要应用程序 窗口需要启动 首选项窗口。 (一个视图 调用另一个视图。)
  2. 应用程序的主要模型 需要访问属性 在偏好模型中。 (一个模型 访问另一个模型。)

这些问题是相关的,因为它们都涉及模型-视图-控制器三元组之间的通信,这是我在 Google 搜索中没有找到太多讨论的主题。

解决此问题的明显方法是将所有内容包装在一个顶级“应用程序”对象中,该对象处理模型之间的事务并允许控制器调用彼此的方法。我已经看到了这个实现,但我不相信这是一个好主意。我还可以看到涉及控制器观察多个模型并响应多个视图的可能性,但这似乎会变得非常混乱且难以理解。

关于如何最好地实施这种串扰的建议?我觉得这是一个非常明显的问题,但我一直无法找到一个有据可查的解决方案。

从更广泛的角度来看,如果有人有一个链接可以显示这些 MVC 问题的典型方法,我很乐意看到它。我没有太多运气找到可靠的、重要的参考资料。 Python 中的示例很不错,但我很乐意阅读任何内容。

编辑 1

我看到下面说了一些非常有趣的事情,总的来说,似乎没有人对我描述的方法有任何问题。它已经几乎是 Vincent 所描述的 FrontController 设计的一种惰性形式。我当然没有预见到在实现该模式时会出现任何问题,但是,似乎没有人真正解决过关于模型间通信的问题。所有的答案似乎都在解决单个模型中对象之间的通信。我对为应用程序的单独组件维护单独的模型更感兴趣,因此我不会将 50 个状态属性填充到单个模型类中。我应该将它们作为子模型进行维护吗?

【问题讨论】:

  • 我们在讨论模型中的多个类。模型是指所有代表数据的类(组件)和对数据的操作构成模型。这些类相互合作。

标签: model-view-controller model view controller components


【解决方案1】:

关于 (1),视图不会调用其他视图。它们调用可能导致呈现其他视图的控制器操作。在您的情况下,主应用程序窗口包含一个用户界面元素(按钮、链接),该元素调用控制器操作以显示首选项窗口。

关于(3),模型组件当然可以相互关联。这不是意外,也不是必须避免的。例如,您的 Customer 模型可能有一组关联的 Orders。通过 Customer 类中的方法访问客户的订单是非常自然的。

您可能想查看维基百科上的MVC page 以了解概览。

【讨论】:

    【解决方案2】:

    模型并不意味着单个模型对象。模型是整个域模型的子集,它与控制器操作和相关视图直接相关。

    【讨论】:

      【解决方案3】:

      您可能需要考虑查找前端控制器设计模式。

      前端控制器模式定义了一个负责处理应用程序请求的组件。前端控制器集中了视图选择、安全性和模板等功能,并将它们一致地应用于所有页面或视图。因此,当这些函数的行为需要改变时,只需要改变应用程序的一小部分:控制器及其辅助类。

      这样,来自视图的所有请求都会发送到 FrontController,然后由 FrontController 决定调用哪个特定操作(控制器)。有时,它可能会像您的第一个案例一样直接转发到另一个视图。

      模型中的多个对象相互交谈没有问题。事实上,这将是非常普遍的。在我看来,Model 中的所有对象就像一个组件来表示数据和对数据的操作。

      This 文章可能会有所帮助。和this 一个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-14
        • 2020-04-06
        • 2011-09-06
        • 2013-06-06
        相关资源
        最近更新 更多