模型 - 视图 - 控制器:谁通知视图

时间:2013-12-22 13:36:11

标签: model-view-controller

Controller收到用户输入。 Controller操纵/编辑模型。 View可以查询Model以获得diplaying的新状态。我没有得到的是谁实际上通知了变化观点?因为在原理图概述中,似乎Controller发送了修改消息,并且模型也通知了视图的更改。

即使在示例中,两者都通知View。如果控制器发送例如针的位置,为什么模型仍然必须通知视图?

[数据来自我们教授的幻灯片,所以无论如何都是正确的]

MVC

Example

2 个答案:

答案 0 :(得分:2)

模型不必通知视图 - 在这种情况下,您将获得MVC的被动实现,请参阅wikipedia

该模型可以例如在后台计算某些内容,例如它可能是计算粒子系统中粒子的位置,并且它可以通知视图更新自身 - 即推模型通常比从视图中轮询模型更有效。

例如,在WebSockets和Comet之前,它始终是Web视图,通知Controller将轮询模型并呈现新视图。使用WebSockets或Comet,您可以让Controller通知视图。

在任何情况下,实现MVC都有无数的旋转,它不是一成不变的,当然你可以根据你的用例进行调整。

答案 1 :(得分:2)

它变得有点混乱,所以我用谷歌搜索了一些领先的authorities必须说的,因为维基百科和第一次点击不如它们看起来那么好。

  • 模型即可。模型管理应用程序域的行为和数据,响应有关其状态的信息请求(通常来自View),并响应更改状态的指令(通常来自Controller)。
  • 查看即可。视图管理信息的显示。
  • 控制器即可。 Controller解释用户的鼠标和键盘输入,通知模型和/或视图以进行适当的更改。

所以看起来控制器会通知视图。

但重要的是要注意View和Controller都依赖于Model。但是,模型既不依赖于View也不依赖于Controller 。这是分离的关键优势之一。这种分离允许独立于视觉呈现来构建和测试模型。

MVC

当然,Controller不是唯一一个更改模型的人。出于这个原因,确实存在一些变化:

当一个Controller专门操作模型时,使用被动模型。控制器修改模型,然后通知View模型已更改并应刷新。此场景中的模型完全独立于视图和控制器,这意味着模型无法报告其状态的变化。

当模型在没有控制器参与的情况下改变状态时,使用活动模型。当其他源更改数据并且更改必须反映在视图中时,可能会发生这种情况。由于只有模型在发生时检测到其内部状态的更改,因此模型必须通知视图以刷新显示。 - >解释案例。