Model view controller 模型视图控制器:谁通知视图

Model view controller 模型视图控制器:谁通知视图,model-view-controller,Model View Controller,控制器接收用户输入。控制器操纵/编辑模型。 视图可以查询模型,以获取用于绘制的新状态。我不明白的是,到底是谁通知视图发生了变化?因为在原理图概述中,控制器似乎发送修改消息,并且模型还通知视图更改 即使在本例中,两者都会通知视图。如果控制器发送例如针的位置,为什么模型仍必须通知视图 [这些数字来自我们教授的幻灯片,因此它们是正确的] 模型不必通知视图-在这种情况下,您将获得MVC的被动实现,请参阅 例如,模型可以计算背景中的某些内容,例如,它可以计算粒子系统中粒子的位置,并且可以在此处和此处通知

控制器接收用户输入。控制器操纵/编辑模型。 视图可以查询模型,以获取用于绘制的新状态。我不明白的是,到底是谁通知视图发生了变化?因为在原理图概述中,控制器似乎发送修改消息,并且模型还通知视图更改

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

[这些数字来自我们教授的幻灯片,因此它们是正确的]


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

例如,模型可以计算背景中的某些内容,例如,它可以计算粒子系统中粒子的位置,并且可以在此处和此处通知视图进行自我更新,即推送模型,推送模型通常比从视图轮询模型更有效

例如,在WebSockets和Comet之前,总是Web视图通知控制器轮询模型并呈现新视图。使用WebSocket或Comet,您可以让控制器通知视图


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

它变得有点混乱,所以我在谷歌上搜索一些领先者的意见,因为Wikipedia和第一批热门文章并没有看上去那么好

  • 型号。该模型管理应用程序域的行为和数据,响应有关其状态的信息请求(通常来自视图),并响应更改状态的指令(通常来自控制器)
  • 查看。视图管理信息的显示
  • 控制器。控制器解释用户的鼠标和键盘输入,通知模型和/或视图根据需要进行更改
因此,控制器似乎会通知视图

但需要注意的是,视图和控制器都依赖于模型。但是,模型既不依赖于视图,也不依赖于控制器。这是分离的主要好处之一。这种分离允许独立于视觉呈现构建和测试模型

当然,控制器不能是唯一改变模型的人。因此,确实存在一些变化:

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

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

因此,这是一种选择,让视图轮询模型,模型直接通知视图,或者控制器更新模型->模型通知控制器->控制器通知视图,或者控制器更新模型->控制器轮询模型状态->控制器通知视图?是,有一系列的选择。例如,在WebSockets和Comet之前,总是Web视图通知控制器轮询模型并呈现新视图。使用WebSocket或Comet,您可以让控制器通知视图。也就是说,你的教授可能对这件事有更严格的看法。@Matthias,那不是MVC。你所描述的可能被称为MVP。@tereško所有四种选择?