MVC MVP MVVM模式对比

219 阅读3分钟

MVC模式

mvc(model-view-controller)

  • model代表了数据模型
  • view代表视图界面
  • controller代表控制器,里面写逻辑处理

mvc模式的用处:把视图,逻辑,数据处理的代码分离,实现模块化管理,降低耦合性。

mvc的优点:简单易理解适合快速开发,具有一定分层。

mvc的缺点:

1.在安卓中view会直接从model中取数据从而使view依赖model,依据model操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。

2.很多处理view的逻辑只能写在Activity中,导致Activity充当了View和Controller的角色,所以view和controller相当于没有解耦。

mvc的使用场景:

  • 当屏幕上有一个单向动作时,我们可以使用MVC,用户的所有交互都会影响Model,但结果不会影响UI
  • 当屏幕足够简单,使用MVC,但是它需要与我们的Model层进行通信

MVP模式

mvp(model—view-presenter)

和mvc的区别就是把controller换成了presenter,把逻辑处理的代码放在了presenter层,完全切断model和view的交流,mvp中view不会直接去使用model,它们之间通信是通过p层,v层通过调用p层实现的接口来对m层数据进行访问,m层数据变化也会调用p层去通知v层进行变化。

mvp模式的用处:解决mvc的c层责任不明的问题。

mvp的优点:

1.降低耦合性,彻底解决了mvc中view和controller责任不明的问题。

2.让view实现可复用,可以将presenter用于多个视图,而不需要改变presenter的逻辑,另外也可以脱离presenter来测试视图。

mvp的缺点:

1.对于UI的输入和数据的变化,需要手动调用p层的接口,缺乏自动性和监听性

2.如果业务需求变大,p层就会存在大量接口,还是无法实现降低耦合性。

3.一旦v层某个ui元素更改,对应的接口也要更改,比如数据如何映射到ui上,事件监听接口都要改变

mvp使用场景:

  • 当屏幕具有双向交流时,可以使用MVP,其中用户交互需要从模型层请求某些内容,并且此请求的结果将影响UI
  • 当受模型层更新影响的UI元素非常有限时,可以使用MVP

MVVM模式

mvvm(model-view-viewmodel)

mvvm的出现是为了解决mvp缺乏自动性监听性的问题,mvvm新增了DataBinding的新特性,mvvm中的view和viewmodel通过DataBinding进行关联,DataBinding通过监听数据的变化直接反映到ui上。安卓实现DataBinding的技术有jetpack的livedata,observable等等,Flutter的则有状态管理模式比如说scope——model模式,bloC模式,provider模式,redux模式等等。

mvvm的优点:通过DataBinding解决mvp缺乏自动性监听性的问题,实现了代码耦合性更加降低(少了那些比如数据变化而要setText等代码,而只需要setdata)。

mvvm的缺点:对于一些状态比较少,视图比较少的项目,使用mvvm就太麻烦了

mvvm的使用场景:

  • 当屏幕包含许多视图时,可以使用MVVM,此时,使每个视图更容易在View-Model中订阅数据源,并在数据源发生更改时自行处理它...数据源可以是Live-Data或Observable,也可以是所使用的框架
  • 当屏幕具有单向流时,也可以使用MVVM,事件来自model,并且在没有任何用户交互的情况下影响UI,常见情况是地图app,屏幕会更新人在Map上的位置,无论何时位置更改时,地图都会更新。