mvc,mvp,mvvm优缺点
MVC
MVC全名是Model–View–Controller,是模型(model)-视图(view)-控制器(controller)的缩写,⼀种软件设计典范,⽤⼀种业务逻辑、数据、界⾯显⽰分离的⽅法组织代码,在改进和个性化定制界⾯及⽤户交互的同时,不需要重新编写业务逻辑。其中Model层处理数据,业务逻辑等;View层处理界⾯的显⽰结果;Controller层起到桥梁的作⽤,来控制View层和Model层通信以此来达到分离视图显⽰和业务逻辑层。
mvc的controller我们往往把Android中界⾯部分的实现也理解为采⽤了MVC框架,常常把Activity理解为MVC模式中的Controller。
看似没有什么特别的地⽅,但是由⼏个需要特别关注的关键点:
1. View是把控制权交移给Controller,⾃⼰不执⾏业务逻辑。
2. Controller执⾏业务逻辑并且操作Model,但不会直接操作View,可以说它是对View⽆知的。
3. View和Model的同步消息是通过观察者模式进⾏,⽽同步操作是由View⾃⼰请求Model的数据然后对视图进⾏更新。
MVC的优缺点
优点:
1. 把业务逻辑全部分离到Controller中,模块化程度⾼。当业务逻辑变更的时候,不需要变更View和Model,只需要Controller换成另外⼀个
Controller就⾏了(SwappableController)。
2. 观察者模式可以做到多视图同时更新。
缺点:
1. Controller测试困难。因为视图同步操作是由View⾃⼰执⾏,⽽View只能在有UI的环境下运⾏。在没有UI环境下对Controller进⾏单元测试的时
候,Controller业务逻辑的正确性是⽆法验证的:Controller更新Model的时候,⽆法对View的更新操作进⾏断⾔。
2. View⽆法组件化。View是强依赖特定的Model的,如果需要把这View抽出来作为⼀个另外⼀个应⽤程序可复⽤的组件就困难了。因为不同程序的
的Domain Model是不⼀样的
MVP
MVP其实是MVC的⼀种演进版本,它更简单,将MVC中的Controller改为了Presenter,View通过接⼝与Presenter进⾏交互,降低耦合,⽅便进⾏单元测试。
View:负责绘制UI元素、与⽤户进⾏交互(Activity、View、Fragment都可以做为View层);
Model:对数据的操作、对⽹络等的操作,和业务相关的逻辑处理;
Presenter:作为View与Model交互的中间纽带,处理与⽤户交互的逻辑。可以把Presenter理解为⼀个中间层的⾓⾊,它接受Model层的数据,并且处理之后传递给View层,还需要处理View层的⽤户交互等操作。
关键点:
1、View不再负责同步的逻辑,⽽是由Presenter负责。Presenter中既有业务逻辑也有同步逻辑。
2、View需要提供操作界⾯的接⼝给Presenter进⾏调⽤。(关键)
对⽐在MVC中,Controller是不能操作View的,View也没有提供相应的接⼝;⽽在MVP当中,Presenter可以操作View,View需要提供⼀组对界⾯操作的接⼝给Presenter进⾏调⽤;Model仍然通过事件⼴播⾃⼰的变更,但由Presenter监听⽽不是View。
MVP的优缺点
优点:
1、便于测试。Presenter对View是通过接⼝进⾏,在对Presenter进⾏不依赖UI环境的单元测试的时候。可以通过Mock⼀个View对
象,这个对象只需要实现了View的接⼝即可。然后依赖注⼊到Presenter中,单元测试的时候就可以完整的测试Presenter业务逻辑的正确性。
2、View可以进⾏组件化。在MVP当中,View不依赖Model。这样就可以让View从特定的业务场景中脱离出来,可以说View可以做
到对业务逻辑完全⽆知。它只需要提供⼀系列接⼝提供给上层操作。这样就可以做⾼度可复⽤的View组件。
缺点:
1、Presenter中除了业务逻辑以外,还有⼤量的View->Model,Model->View的⼿动同步逻辑,造成Presenter⽐较笨重,维护起来
会⽐较困难。
MVVM
MVVM模式(Model–View–ViewModel模式),和MVP模式相⽐,MVVM模式⽤ViewModel替换了Presenter,其他层基本上与MVP 模式⼀致,ViewModel可以理解成是View的数据模型和Presenter的合体。
MVVM采⽤双向绑定(data-binding):View的变动,⾃动反映在ViewModel,反之亦然,这种模式实际上是框架替应⽤开发者做了⼀些⼯作(相当于ViewModel类是由库帮我们⽣成的),开发者只需要较少的代码就能实现⽐较复杂的交互。
MVVM的调⽤关系
MVVM的调⽤关系和MVP⼀样。但是,在ViewModel当中会有⼀个叫Binder,或者是Data-bindingengine的东西。以前全部由Presenter负责的View和Model之间数据同步操作交由给Binder处理。你只需要在View的模版语法当中,指令式地声明View上的显⽰的内容是和Model的哪⼀块数据绑定的。
当ViewModel对进⾏Model更新的时候,Binder会⾃动把数据更新到View上去,当⽤户对View进⾏操作(例如表单输⼊),Binder也会⾃动把数据更新到Model上去。这种⽅式称为:Two-waydata-binding,双向数据绑定。可以简单⽽不恰当地理解为⼀个模版引擎,但是会根据数据变更实时渲染。
关键点:
MVVM把View和Model的同步逻辑⾃动化了。以前Presenter负责的View和Model同步不再⼿动地进⾏操作,⽽是交由框架所提供的Binder进⾏负责。
只需要告诉Binder,View显⽰的数据对应的是Model哪⼀部分即可。
MVVM的优缺点
优点:
1、提⾼可维护性。解决了MVP⼤量的⼿动View和Model同步的问题,提供双向绑定机制。提⾼了代码的可维护性。
2、简化测试。因为同步逻辑是交由Binder做的,View跟着Model同时变更,所以只需要保证Model的正确性,View就正确。⼤⼤减
少了对View同步更新的测试。
缺点:
1、过于简单的图形界⾯不适⽤,或说⽜⼑杀鸡。
2、对于⼤型的图形应⽤程序,视图状态较多,ViewModel的构建和维护的成本都会⽐较⾼。
3、数据绑定的声明是指令式地写在View的模版当中的,这些内容是没办法去打断点debug的。
从MVC->MVP->MVVM,就像⼀个打怪升级的过程。后者解决了前者遗留的问题,把前者的缺点优化成了优点。同样的Demo功能,代码从最开始的⼀堆⽂件,优化成了最后只需要20⼏⾏代码就完成。MV*模式之间的区分还是蛮清晰的,希望可以给对这些模式理解⽐较模糊的同学带来⼀些参考和思路。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论