在我实现它之前正确理解MVC 的第三个问题:
我有两个案例:
这些问题的相关之处在于它们都涉及模型 - 视图 - 控制器三元组之间的通信,这个主题在我的谷歌搜索中没有找到太多讨论。
解决这个问题的显而易见的方法是将所有内容包装在顶层“应用程序”对象中,该对象处理模型之间的事务,并允许控制器调用彼此的方法。我已经看到了这个实现,但我不相信它是一个好主意。我还可以看到控制器观察多个模型并响应多个视图的可能性,但这似乎会变得非常混乱,难以理解。
关于如何最好地实施这种串扰的建议?我觉得这是一个非常明显的问题,但我一直无法找到一个记录完备的解决方案。
更广泛地说,如果有人有链接显示这些MVC问题的典型方法,我很乐意看到它。我没有太多运气找到可靠的,非平凡的参考资料。 Python中的例子很可爱,但我很乐意阅读任何内容。
修改1 :
我看到下面说的一些非常有趣的事情,一般来说,没有人似乎对我所描述的方法有问题。它已经几乎是Vincent描述的FrontController设计的一种懒惰形式。我当然没有预见到实施这种模式会有任何问题,但是,似乎没有人真正解决过模型之间的沟通问题。所有答案似乎都是在单个模型中解决对象之间的通信问题。我更感兴趣的是为应用程序的单独组件维护单独的模型,因此我不会将50个状态属性填充到单个Model类中。我应该将它们作为子模型来维护吗?
答案 0 :(得分:3)
关于(1),视图不会调用其他视图。它们调用可能导致呈现其他视图的控制器操作。在您的情况下,主应用程序窗口包含一个用户界面元素(按钮,链接),它调用控制器操作以显示首选项窗口。
关于(3),模型组件当然可以彼此相关。这不是意料之外的,也不是必须避免的。例如,您的客户模型可能有一组关联的订单。通过Customer类中的方法访问客户的订单是完全自然的。
您可能需要查看维基百科上的MVC page以获取概述。
答案 1 :(得分:2)
您可能需要考虑查找Front Controller设计模式。
Front Controller模式定义了一个负责处理应用程序请求的组件。前端控制器集中了视图选择,安全性和模板等功能,并在所有页面或视图中一致地应用它们。因此,当需要更改这些函数的行为时,只需要更改应用程序的一小部分:控制器及其辅助类。
这样,来自视图的所有请求都会转到FrontController,然后FrontController决定调用哪个特定操作(控制器)。有时,它可以直接转到另一个视图,如第一种情况。
模型中的多个对象相互通信没有问题。事实上,这将是非常普遍的。我看到它的方式,模型中的所有对象就像一个组件来表示数据上的数据和操作。
答案 2 :(得分:0)
模型并不意味着单个模型对象。该模型是整个域模型的子集,它与控制器操作和相关视图直接相关。