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之间的关系可以分为三大类
- View从Model读取数据 (Read)
- View向Model写入数据 (Write)
- Model向View更新数据 (Update)
Model和View好比是鱼——吾所欲也。
怎么实现上面三大类关系,就好比“渔”,貌似方法就在那里,具体的方法却常常各有不同。
Controller
这个介于Model和View中间的东西如果叫做Controller。那么
- View从Controller中获得数据进行渲染展示 (Read)
- View提出请求
$controller->read_data()
- View提出请求
- View如果需要改变Model,则通过Controller中转这种请求 (Write)
- View提出请求
$controller->write_data()
- View提出请求
- Model如果发生了改变,则通过Controller将数据传给View (Notify)
- View申请监听数据变化
$controller->onchange($view->callback)
- Model通知Controller数据变化
$controller->notify("change")
- Controller通知View数据变化
$view->callback($data)
- 实质上等效于
$view->callback($controller->read_data())
- 实质上等效于
- View申请监听数据变化
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。