Model view controller web应用程序的正确MVC图是什么?

Model view controller web应用程序的正确MVC图是什么?,model-view-controller,design-patterns,Model View Controller,Design Patterns,哪个MVC图是正确的?每个都有不同的箭头 图1 图2 (来源:) 图3 图4 (来源:) 图5 (来源:)他们都是 MVC是一种模糊的模式 我对MVC的看法是: 控制器 对象具有模型集合,并具有查看和编辑模型的方法。它与模型对话并返回应用了模型的视图实例 查看 将模型的定义附加到它,并且只是显示特定模型的一组功能 型号 封装数据。具有返回状态和更改状态的方法 //Controller import Views class Controller private Models //

哪个MVC图是正确的?每个都有不同的箭头

图1

图2


(来源:)

图3

图4


(来源:)

图5


(来源:)

他们都是

MVC是一种模糊的模式

我对MVC的看法是:

控制器

对象具有模型集合,并具有查看和编辑模型的方法。它与模型对话并返回应用了模型的视图实例

查看

将模型的定义附加到它,并且只是显示特定模型的一组功能

型号

封装数据。具有返回状态和更改状态的方法

//Controller
import Views

class Controller
  private Models

//View
import Model

class View

//Model
class Model
模型不需要知道有关视图/控制器的任何信息。视图需要知道模型的定义。控制器需要拥有模型,并且需要知道视图的定义


您可以将它们更紧密地结合在一起,这是可选的。

事实上有一点不同

有两种类型的模型:主动模型和被动模型:第一种模型具有通知机制,第二种模型不知道在MVC中使用

第一个和第四个图表示具有活动模型的MVC


您可以阅读更多信息。

它们实际上都没有错,但基于Web(请求/响应)的MVC和客户端MVC有一种不同的方法

在web环境中,控制器负责处理用户请求、修改模型(如果适用)、找到正确的视图、将模型信息分配给视图并将其返回给用户


在对原始MVC模式(speak desktop applications)更直接的解释中,模型会在视图发生变化时直接更新视图,控制器会处理用户输入和应用程序逻辑,并相应地更新模型。但是,这不适用于普通的web应用程序,因为HTTP是无状态的,并且没有使用任何其他最新技术(如注释中提到的长轮询Ajax或WebSocket),服务器无法真正通知客户端模型的更改。

图1和图4是正确的MVC模式。其余的更接近MVP模式


尽管在web MVC中,您有一个被动的模型,并且更改是由模型中的视图拉动的,而不是由模型(观察者模式)推动的。

MVC,严格地说,是一种过时的模式。粗粒度地说,它引入了视图和模型之间的依赖关系,因为模型直接更新视图状态
(),如图4所示,根据MVC最初的历史公式,您可以看到模型和视图之间的直接交互,这是不可取的。事实上,今天我们已经修改了MVC的版本,有时我们描述MVP并称之为MVC。缩略词“MVC”的使用非常自由,以至于任何有三个元素(称为Model、View和Controller)的东西基本上都是MVC,不管实现细节和责任定义如何。当您描述MVC和MVP时,它们之间的区别非常细微,并且存在于视图和演示者(控制器)职责的定义中。事实上,马丁·福勒(Martin Fowler)在几年前向MVP(和MVC)道别(),我们可以从他的角色中找到一种“新”模式的定义,称为展示模型(Presentation Model,简称PM)。微软已经为其WPF和Silverlight技术定义了另一种模式,称为模型-视图-演示者,或MVVM(参见),他的灵感来自于演示模型。我想你可以看看所有这些家伙,看看他们有多相似(和不同)。在我看来,基本思想是表示数据和行为留在Presenter中,模型不知道视图(所以图4是关闭的,即使是MVC),并且您应该能够以一种无痛的方式更改视图(或支持不同的视图实现),与Presenter和模型分离。表示模型可以提供这一点,并且使用当前技术可以有效而彻底地实现。

图2、图3和图5对于MVC来说是准确的。当向控制器发送请求时,它使用模型执行操作,然后作出响应。

图1是MVC模式的正确描述

实线表示实际参考,如在变量中。这意味着您应该期望在视图和控制器中看到模型的实例

虚线表示从一个到另一个的函数调用或消息。从模型到视图的虚线是通过观察者模式实现的,在观察者模式中,模型上发生了一些变化,它引用了视图(通过模型的观察者API),并在视图上调用了方法。类似于
observer[i].update(“name”、value、self)
的内容,当某些内容发生变化时,将在模型中调用它

视图和控制器之间的虚线是向控制器发送消息的视图。想象一下,用户界面上有一个点击的按钮。控制器正在侦听此事件并对其进行处理

通信流的一个例子是点击按钮:视图向控制器发送消息。控制器处理该事件,并在其中更新其模型实例,例如
Model.name
。模型有一个
setter
方法,该方法更新
名称
,并调用一个类似
changed
的方法,然后该方法在其观察者上循环,并在每个观察者上调用
.update
。以前的视图
订阅了该模型,并使用
name
的新旧值调用了
update
。视图中的
update
方法更新
标签中的名称值。完成。

描述MVC的幻灯片组: