链接:https://www.zhihu.com/question/28893576/answer/42510822
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
要谈MVVM,我想是不能绕开MVC的。
MVC的出现是随着代码规模的上升而粗现的,问MVVM,我想题主对MVC已经有一定的了解了,MVC的前世今生就不展开了。
<img src="https://i-blog.csdnimg.cn/blog_migrate/7f48eacf720896c396ccc7756716f33c.png" data-rawwidth="850" data-rawheight="369" class="origin_image zh-lightbox-thumb" width="850" data-original="https://pic1.zhimg.com/ed944ca7a31ded0bc5ff80c6e5847e7c_r.jpg">

Model负责数据的处理,View负责视图的显示以及需要的监视,Controller用于流程控制。
基本的思想是:
View(界面)触发事件 –> Controller(业务)处理了业务,然后触发了数据更新;
或者
不知道谁更新了Model的数据–》Model(带着数据)通知View–》View更新数据。
逻辑清晰。
<img src="https://i-blog.csdnimg.cn/blog_migrate/f8ecd2f4fb845d3f6e1d1c4337f0d65a.png" data-rawwidth="850" data-rawheight="367" class="origin_image zh-lightbox-thumb" width="850" data-original="https://pic2.zhimg.com/a80db04abccbaba91c5faaf217b4a085_r.jpg">这里的差别主要是取消了View和Model的耦合,Model发生变化时通知controller,由controller来更新view。

这里的差别主要是取消了View和Model的耦合,Model发生变化时通知controller,由controller来更新view。
在这两种里面,在理想上设计的很美好,优点一大堆,在实际中,却有几个不尽如人意的地方,其中最大的问题,在于Controller的臃肿:
负责View的布局、加载、展示顺序,
View的logic,
要负责连接View和Model,
负责多种事件响应
。。。。。
目前为止,我见过的最多的Controller类,有超过6k行代码,里面的功能过多,调来调去,牵一发而动全身,测试和维护极为困难。
除此之外,有些逻辑,诸如网络请求、数据校验这样的logic放在Controller还是Model中,似乎在不同的代码中有着不同的答案。
在我看来,MVVM就是为了解决这两个问题,Controller的高度臃肿和logic位置的模棱两可。一个典型的MVVM如下图所示(自己画的,凑合看看):
<img src="https://i-blog.csdnimg.cn/blog_migrate/7dcda43ef8241bf9c0971a1bcdf3758f.png" data-rawwidth="1376" data-rawheight="222" class="origin_image zh-lightbox-thumb" width="1376" data-original="https://pic4.zhimg.com/75260b123a7204649cb5bb06dd35bf27_r.jpg">这里多出来了一个ViewModel,那代码多出来多少呢?

这里多出来了一个ViewModel,那代码多出来多少呢?
很少。
由于View和Controller终于正式在一起了,这个ViewModel就是MVC的Controller中除了view展示和事件响应之外的诸如业务逻辑、网络请求、合法性校验这些代码组成的,这些代码本来就是要写的。正因为如此,从MVC切到MVVM像
说白了,这是Model层对Controller层的适配器,Controller调用Model、发起网络请求、从Model取出的字符串要本地化、检查View中输入的Email是否合法等等这些,全部放在VM(ViewModel)中。题主的问题,也就有答案了吧。
至于MVVM的好处,一是Controller的瘦身,二是ViewModel的复用和良好的可测试性,这些代码能复用真实爽歪歪了,第三是一个隐藏属性,如果你使用响应式编程的话,代码量会明显减少(在iOS上使用ReactiveCocoa和MVVM,代码量可以减少30%左右)。
欢迎指正。