【发布时间】:2014-01-10 20:58:30
【问题描述】:
控制器接收用户输入。控制器操作/编辑模型。 View 可以查询 Model 以获得新的显示状态。我不明白的一点是谁实际上通知了视图的变化?因为在原理图概览中,似乎 Controller 发送了修改消息,而 Model 也通知了 View 更改。
即使在示例中,两者都通知视图。如果控制器发送例如针的位置,为什么模型还必须通知视图?
[这些数字来自我们教授的幻灯片,所以无论如何它们都是正确的]
【问题讨论】:
控制器接收用户输入。控制器操作/编辑模型。 View 可以查询 Model 以获得新的显示状态。我不明白的一点是谁实际上通知了视图的变化?因为在原理图概览中,似乎 Controller 发送了修改消息,而 Model 也通知了 View 更改。
即使在示例中,两者都通知视图。如果控制器发送例如针的位置,为什么模型还必须通知视图?
[这些数字来自我们教授的幻灯片,所以无论如何它们都是正确的]
【问题讨论】:
这变得有点令人困惑,所以我用谷歌搜索了一些领先的 authorities 不得不说的内容,因为维基百科和第一次点击并不像看起来那么好。
看来是Controller通知了View。
但需要注意的是,View 和 Controller 都依赖于 Model。然而,模型既不依赖于视图也不依赖于控制器。这是分离的主要好处之一。这种分离允许独立于视觉呈现来构建和测试模型。
当然,控制器不能是唯一改变模型的人。出于这个原因,确实存在一些变化:
被动模型在一个控制器专门操纵模型时使用。控制器修改模型,然后通知视图模型已更改并且应该刷新。该场景中的Model完全独立于View和Controller,这意味着Model没有办法报告其状态的变化。
active 模型用于模型在没有控制器参与的情况下更改状态。当其他源正在更改数据并且更改必须反映在视图中时,可能会发生这种情况。因为只有模型在发生变化时检测到其内部状态的变化,所以模型必须通知视图刷新显示。 -> 解释案例。
【讨论】:
模型不一定要通知视图 - 在这种情况下,您会获得 MVC 的被动实现,请参阅 wikipedia。
例如,模型可以在后台计算某些东西,例如它可以在粒子系统中计算粒子的位置,并且可以在这里和那里通知视图进行自我更新 - 即通常比从视图轮询模型更有效的推送模型。
例如,在 WebSockets 和 Comet 之前,总是由 Web 视图通知控制器,控制器将轮询模型并呈现新视图。使用 WebSockets 或 Comet,您可以让 Controller 通知 View。
在任何情况下,实现 MVC 都有无数种变化,它不是一成不变的,当然您可以根据您的用例对其进行调整。
【讨论】: