Model, View, and ? (MVC / MVP / MVVM)

  • MVC = Model + View + Controller
  • MVP = Model + View + Presentor
  • MVVM = Model + View + View Model

Model和View

  • Model是抽象出来的数据模型
  • View是用来展示给人看的

Model包含了核心数据,并且结合存储和查询方面的考虑做过变形处理。

View一方面从Model获取数据并显示,另一方面也是对Model中的数据进行修改的媒介。

毫无疑问,Model和View之间需要通过一组程序逻辑Link在一起。

有意思的是,Model和View都可以认为是某种“实体”,其形式是“确定”的。而那个Link却没有一个必然的形式。好比起点和终点毫无疑问,行进的路径却可以千姿百态。

Model和View之间的关系可以分为三大类

  1. View从Model读取数据 (Read)
  2. View向Model写入数据 (Write)
  3. Model向View更新数据 (Update)

Model和View好比是鱼——吾所欲也。

怎么实现上面三大类关系,就好比“渔”,貌似方法就在那里,具体的方法却常常各有不同。

Controller

这个介于Model和View中间的东西如果叫做Controller。那么

  • View从Controller中获得数据进行渲染展示 (Read)
    • View提出请求 $controller->read_data()
  • View如果需要改变Model,则通过Controller中转这种请求 (Write)
    • View提出请求 $controller->write_data()
  • Model如果发生了改变,则通过Controller将数据传给View (Notify)
    • View申请监听数据变化$controller->onchange($view->callback)
    • Model通知Controller数据变化$controller->notify("change")
    • Controller通知View数据变化 $view->callback($data)
      • 实质上等效于$view->callback($controller->read_data())

Presenter

上面的MVC模型中,可以看到,Model和View通过Controller中转的都是数据。从View的角度来看,相当于从Controller哪里pull数据。

如果Controller换成Presenter的话,对于"Read"和"Write",没啥变化。

在"Update"这种情况下,"Controller"可以选择不是通过callback传递数据,而是通过View提供的接口(interface)直接修改View。

对比一下,Controller模式下的View是一个“封闭王国”,只从外部(Controller)那里进口数据,然后自己做主进行View相关的操作。

Presenter模式下,View则对外公布了一组接口,其他人(Controller)可以通过这组接口对View进行操作。

Controller模式下,可以看作是Controller建立了某种标准,View来遵照这个标准获得数据。

Presenter模式下,View实际上是建立了某种“标准”。这种标准下,Presenter遵照这种标准操作View。

View Model

不管是Controller还是Presenter,人们还是需要写很多胶水代码把View和Model联系起来。区别只是谁来负责操作View的显示——是View自己还是Presenter。

工程实践中,这些胶水代码常常很多,写起来也很琐碎。

如果可以通过某种规则描述View和Model之间的映射关系,然后自动生成那些胶水代码的逻辑就好了。这就是View Model的想法。

Web开发

传统上,开发人员需要有三类

  • 负责Model的
  • 负责View的
  • 负责Controller或Presenter的

Controller模式下,View获得的只是数据。实践中主要是在服务器端通过模板来实现。

Presenter模式下,Presenter获得数据并且负责显示。实践中主要是或者是在客户端通过Ajax获得数据后,然后操作DOM。

在View Model这种模式下,负责View的人通过特定的规则描述与Model之间的映射关系。不再需要人来实现Controller或Presenter。

网络资源