理解MVC、MVP和 MVVM
一、简介
- 这是一个逐渐演化的过程。最开始是MVC,后来发展到MVP,最后是MVVM。
- https://gitee.com/zlgopen/awtk-mvvm/blob/master/docs/8.intro.md 参考了这里的介绍。
二、MVC
-
MVC 模式是 (Model-View-Ctrl) 。
-
Model 其实指的是业务流程。不仅仅是数据。用小霸王游戏机来理解的话,这个Model就是我们插的卡。
-
View 就是显示。用小霸王游戏机来理解的话,View就是显示器。
-
Ctrl 就是输入。用小霸王游戏机来理解,就是键盘,鼠标,手柄。
-
MVC模式的图示:
-
其实在小霸王游戏机中的MVC可能不是这样的。而是:
-
对于触屏手机出现之后,MVC才变成这样。
-
对于触屏手机而言,ctrl和view是耦合在一起的,所以图示应该变成这样:
-
这就是个问题,因为MVC似乎变成了一个耦合系统了。很容易让软件不好扩展。
-
三、MVP
-
因为MVC 已经成了一个耦合系统了。MVP运用而生。
-
我理解的就是在已经耦合在一起的View/Ctrl 和 Model 中间加一层抽象层。不要让视图直接和业务逻辑耦合起来。
-
MVP模式是解耦了视图和模型。但是有个问题。每个视图中的控件操作,要想作用于Model,都需要在Presenter绑定。隔离的方法就是使用函数指针嘛。那你就要加很多的函数指针,并且在初始化的时候赋值。
-
这在写代码的时候,会十分痛苦,因为要写很多对业务逻辑没有意义的代码,只是为了解耦View-Model。
四、MVVM
-
MVVM 模式,是键 Presenter 换成了 ViewModel 。如图:
-
MVP模式,Presenter 需要绑定很多的回调函数去访问和操作视图。可以说MVP的思想是没有问题的,但是写代码的时候会很痛苦。
-
MVVM 模式,ViewModel会通过固定的 数据绑定和命令绑定来和视图交互。比如一个点击事件 on_click=function_click。这是一个事件绑定。如果在视图中加上这个配置,ViewModel会直接调用 Model 中 function_click 对应的函数。
-
那这不是还是要绑定回调函数吗?是的,只不过ViewModel是自动生成的代码,不是人手动写的。比如,我们可以根据自定义的规则,把on_click的function_click函数绑定到我们已经在model中实现的函数。
-
正因为如此,我认为MVVM才会优于MVC/MVP。
五、总结
- MVC在view和Ctrl结合之后,就变成一个耦合系统了。
- MVVM的优势在于,使用ViewModel不仅仅隔离了View和Model,还可以自动生成代码,不用人手动去一个个绑定。
- web 界面采用的就是MVVM模式。果然,web是目前最好的UI。