Android面试

MVC、MVP、MVVM的简单理解

2020-04-03  本文已影响0人  星邪Ara

文章脑图

文章内容

1、MVC、MVP、MVVM关系

2、MVC

软件由MVC的View、Controller、Model三部分组成

View 接受用户指令 Controller 接受用户指令

但是我们可以根据需求调整MVC实现方式,如下图


示例

优点:

  1. 耦合性低:模型与控制器和视图相分离,可以很容易改变应用程序的数据层和业务规则
  2. 重用性高:模型与控制器和视图相分离,最大化的进行代码重用
  3. 拓展性高:无论想增加模块或修改业务,只需增加或修改相应的MVC,技术含量降低
  4. 可维护性高:模型与控制器和视图相分离,降低相互影响程度,易于维护

缺点:

  1. 不适合小型项目:MVC之间关联性强,没有做到独立重用
  2. 复杂性高:遵循MVC设计会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率
  3. 耦合性高:模型与控制器和视图虽然相分离,但MVC之间关联性太强,阻碍了独立重用
  4. 损害操作性能:模型操作接口不同,视图可能要多次调用才能获得足够显示数据。对未变化数据进行不必要的频繁访问

3、MVP

软件由MVP的View、Presenter、Model三部分组成,由MVC改变Controller层含义和改变通信方向演变而来

MVP

优点:

  1. 耦合性低:实现了Model和View真正的完全分离,可以修改View而不影响Modle
  2. 复用性高:实现了Model和View真正的完全分离,最大化的进行代码重用
  3. 职责明确、层次清晰:只需定义好View与Presenter的接口,即可实现UI与业务逻辑独立开发,可由不同的开发团队分别实现
  4. 可维护性高:业务逻辑只在Presenter中进行维护,接口请求及缓存策略只在Model中进行维护,遵循了单一职责类的设计原则,提升了代码的可维护性
  5. 可测试:业务逻辑都集中在Presenter,那么我们就可以脱离用户接口来测试这些业务逻辑(单元测试)

缺点:

  1. V和P交互频繁:由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁
  2. Presenter维护困难:Presenter中除了应用逻辑以外,还有大量的View->Model,Model->View的手动同步逻辑,造成Presenter比较笨重,维护起来会比较困难。
  3. 关联性高:Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了。
  4. 额外的代码复杂度及学习成本

4、MVVM

软件由MVP的View、ViewModel、Model三部分组成,由MVC改变Controller层含义和改变通信方向演变而来,和MVP一样
MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。它立足于原有MVP框架并且把WPF的新特性糅合进去,以应对客户日益复杂的需求变化。

【视图模型】MVVM模式的核心,它是连接View和Model的桥梁。它有两个方向:一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。这两个方向都实现的,我们称之为数据的双向绑定。

在MVVM的框架下视图和模型是不能直接通信的。它们通过ViewModel来通信,ViewModel通常要实现一个observer观察者,当数据发生变化,ViewModel能够监听到数据的这种变化,然后通知到对应的视图做自动更新,而当用户操作视图,ViewModel也能监听到视图的变化,然后通知数据做改动,这实际上就实现了数据的双向绑定。并且MVVM中的View和ViewModel可以互相通信。

MVVM

优点:

  1. 低耦合:视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
  2. 复用性高:你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
  3. 独立开发:开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。
  4. 可测试:界面素来是比较难于测试的,测试可以针对ViewModel来写。
  5. 一致性:数据源和视图实现了双向绑定,很好的做到了数据的一致性

缺点:

Bug难定位:数据绑定使得Bug很难被调试。你看到界面异常了,有可能是你View的代码有Bug,也可能是Model的代码有问题
开销大:一个大的模块中,Model也会很大,虽然使用方便了也很容易保证了数据的一致性,当长期持有,不释放内存,就造成了花费更多的内存
不利于代码重用:数据双向绑定不利于代码重用。客户端开发最常用的重用是View,但是数据双向绑定技术,让你在一个View都绑定了一个Model,不同模块的Model都不同,那就不能简单重用View了

5、参考

阮一峰 MVC,MVP 和 MVVM 的图示

上一篇下一篇

猜你喜欢

热点阅读