前言

我使用 MVVM 设计模式也算是先驱者中的一员了(当初都还不明白 MVP 设计模式时,使用 MVC 的万能 Activity 进行 Android App 开发),可是只是浅尝而止,在扑咚健康App (遗憾,这个 App 看来并没有上架,而是基于框架修改店员的平板客户端)中尝试了 databinding 测试版,一是对于测试版的不信任,二是之后项目的开发都排版决定了 MVP 设计模式。刚好这段时间返璞归真,重新开始学习,所以决定仔细研究 MVVM 设计模式。

先来聊聊 MVC、MVP、MVVM

在传统的框架中,提的最多的是MVC和MVP。其中MVC出现与上世纪70年代,在三十多年的工程实践中,MVC充分证明了它的成功,同时在漫长的时间中演变出了许多变种,其中也包括MVP、MVC和MVP最大的差别在与控制层对于整个框架的控制力上。Android中经常会出现数千行的Activity代码,究其原因,我认为是Android中纯粹作为View的各个XML视图功能太弱,Activity基本上都是View和Controller的合体,既要负责视图的显示又要加入控制逻辑,承担的功能过多,代码量大也就不足为奇。所以我认为在Android上,MVP优于MVC,是因为我们需要更强力的控制层最大程度上分担Activity中逻辑的部分,具体的思想可以参考MagiLu的博客:Android App整体架构设计的思考(一)MVVM可以算是MVP的升级版,其中的VM是ViewModel的缩写,ViewModel可以理解成是View的数据模型和Presenter的合体,ViewModel和View之间的交互通过Data Binding完成,而Data Binding可以实现双向的交互,这就使得视图和控制层之间的耦合程度进一步降低,关注点分离更为彻底,同时减轻了Activity的压力,三者之间的差别如下如所示:

MVC、MVP、MVVM 图形示意
VM中View的数据模型每个页面当然只有一套,但是Presenter的试用,建议根据逻辑拆开,不然 Presenter 就重蹈了万能 Activity 的覆辙,出现了冗长的代码串。

好好聊聊 MVVM

Android MVVM 设计模式的实现主要归功于 Google 带入的 Databinding,给 Google 点个赞。
MVC -> MVP -> MVVM 这几个软件设计模式是一步步演化发展的,MVVM 是从 MVP 的进一步发展与规范,MVP 隔离了 M 与 V 的直接联系后,靠 Presenter 来中转,所以使用 MVP 时 P 是直接调用 View 的接口来实现对视图的操作的,这个 View 接口的东西一般来说是 showData、showLoading...M 与 V是隔离了,方便测试了,但代码还不够优雅简洁啊,所以 MVVM 就弥补了这些缺陷。在 MVVM 中就出现的 Data Binding 这个概念,意思就是 View 接口的 showData 这些实现方法可以不写了,通过 Binding 来实现。。在 Android 中,我个人也是把 Activity、Fragment 当做 View 层的东西的,题主所说 ”一些逻辑操作与当前Context有关“,除了弹 Dialog(而且这也是 View),其它情况基本可以自己重写 Application 来拿 ApplicationContext,那么题主所说的逻辑操作可以不在 Activity、Fragment 出现吧。VM 也是 M 与 V 的桥梁啊,怎么会有很多操作呢~一般场景下一个 View 就会有一个相应的 VM。最后分享一个网站,https://speakerdeck.com (Speakerdeck of GitHub Inc - 在线简报、PDF分享展示平台!)以及下面的两个与题目相关的PPT。Clean Android Architecture(这里有 Coursera App Architecture 的设计分析哦,很赞,Demo App 的 Github)。

How to use MVVM pattern in Android (Droidcon Krakow 2014Last:Architecting Android…The clean way(自行搜索译文)

更多相关文章

  1. 关于Android的屏幕适配
  2. Android(安卓)高级UI
  3. [置顶] Android(安卓)- 底部菜单架构设计及封装实现
  4. 《Google!Android2手机应用程序设计入门》笔记(1)
  5. UISwipeGestureRecognizer ---手指动作
  6. 在android设计中,如何在有限的界面上做布局
  7. Android中Fragment的用法总结
  8. 《第一行代码Android》学习总结第二章 Acitivity的生命周期与启
  9. 手把手教你仿一个知乎日报Android客户端(三)主页面设计

随机推荐

  1. 介绍C#中的堆和栈
  2. 介绍C#中的接口
  3. 比较C#中值类型和引用类型的区别
  4. C#/.NET易错的几点
  5. Sql的执行过程说明
  6. 比较C#和JAVA中面向对象语法的区别
  7. 有关UML的基础介绍
  8. C#中匿名对象与var以及动态类型 dynamic
  9. 比较TCP与UDP之间的区别
  10. c# webservice中访问http和https的wsdl以