MVVM和MVC和MVP
MVC (Model View Controller)
- View 传送指令到 Controller
- Controller 完成业务逻辑后,要求 Model 改变状态
- Model 将新的数据发送到 View,用户得到反馈
MVC有两个很明显的问题:
1.m层和v层直接打交道,导致这两层耦合度高
2.因为所有逻辑都写在c层,导致c层特别臃肿
MVP (Model-View-Presenter)
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。
特点:
1. 各部分之间的通信,都是双向的。
2. View 与 Model 不发生联系,都通过 Presenter 传递,可以更高效地使用模型。
3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。
4. 我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
缺点:
由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁。还有一点需要明白,如果Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了。比如说,原本用来呈现Html的Presenter现在也需要用于呈现Pdf了,那么视图很有可能也需要变更。
从上图可以看出,Presenter是Model和View之间的桥梁,为了让结构变得更加简单,View并不能直接对Model进行操作,这也是MVP与MVC最大的不同之处。
MVP模式的作用:
-
分离了视图逻辑和业务逻辑,降低了耦合
-
Activity只处理生命周期的任务,代码变得更加简洁
-
视图逻辑和业务逻辑分别抽象到了View和Presenter的接口中去,提高代码的可阅读性
-
Presenter被抽象成接口,可以有多种具体的实现,所以方便进行单元测试
-
把业务逻辑抽到Presenter中去,避免后台线程引用着Activity导致Activity的资源无法被系统回收从而引起内存泄露和OOM
MVVM (Model-View-ViewModel)
MVVM 模式将 Presenter 改名为 ViewModel.
MVVM是web前端的一种非常流行的开发模式,利用MVVM可以是我们的代码更专注于处理业务逻辑而不是像jquery去更关心DOM操作。目前著名的MVVM框架有VUE、angular等,这些框架各有千秋,但是实现的思想大致上是相同的:数据绑定+视图刷新。跟MVC一样,主要目的是分离视图(View)和模型(Model)。View可以独立于Model的变化和修改,一个ViewModel可以绑定到不同的View上,当View变化的时候Model可以不变,当Model变化时View也可以不变,在MVVM中,数据是核心,由于ViewModel与View之间的双向绑定,操作了ViewModel中的数据(当然只能是监控属性),就会同步到DOM,我们通过DOM事件监控用户对DOM的改动,也会同步到ViewModel。