MVP VS MVVM

413 阅读3分钟

1. mvp

MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。

img

  1. 各部分之间的通信,都是双向的。

  2. View 与 Model 不发生联系,都通过 Presenter 传递。

  3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

2. mvvm

MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。

img

唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。AngularEmber 都采用这种模式。

MVVM 由下面三层组成:

  • View:主要进行视图控件的一些初始设置,不应该有任何的数据逻辑操作。
  • Model:定义实体类,以及获取业务数据模型,比如通过数据库或者网络来操作数据等。
  • ViewModel:作为连接 View 与 Model 的中间桥梁,ViewModel 与 Model 直接交互,处理完业务逻辑后,通过 DataBinding 将数据变化反应到用户界面上。
优点
  1. 低耦合度 在 MVVM 模式中,数据处理逻辑是独立于 UI 层的。ViewModel 只负责提供数据和处理数据,不会持有 View 层的引用。而 View 层只负责对数据变化的监听,不会处理任何跟数据相关的逻辑。在 View 层的 UI 发生变化时,也不需要像 MVP 模式那样,修改对应接口和方法实现,一般情况下ViewModel 不需要做太多的改动。
  2. 数据驱动 MVVM 模式的另外一个特点就是数据驱动。UI 的展现是依赖于数据的,数据的变化会自然的引发 UI 的变化,而 UI 的改变也会使数据 Model 进行对应的更新。ViewModel 只需要处理数据,而 View 层只需要监听并使用数据进行 UI 更新。
  3. 异步线程更新 Model Model 数据可以在异步线程中发生变化,此时调用者不需要做额外的处理,数据绑定框架会将异步线程中数据的变化通知到 UI 线程中交给 View 去更新。
  4. 方便协作 View 层和逻辑层几乎没有耦合,在团队协作的过程中,可以一个人负责 UI,一个人负责数据处理。并行开发,保证开发进度。
  5. 易于单元测试 MVVM 模式比较易于进行单元测试。ViewModel 层只负责处理数据,在进行单元测试时,测试不需要构造一个 fragment/Activity/TextView 等等来进行数据层的测试。同理 View 层也一样,只需要输入指定格式的数据即可进行测试,而且两者相互独立,不会互相影响。
  6. 数据复用 ViewModel 层对数据的获取和处理逻辑,尤其是使用 Repository 模式时,获取数据的逻辑完全是可以复用的。开发者可以在不同的模块,多次方便的获取同一份来源的数据。同样的一份数据,在版本功能迭代时,逻辑层不需要改变,只需要改变 View 层即可。

注意:在使用数据绑定时,建议使用viewBinding代替DataBinding