小议Android开发中的MVC,MVP和MVVM

3 篇文章 0 订阅
1 篇文章 0 订阅
俺是做Android开发的。重点从Android角度诠释。
以下仅是个人见解与整理,仅供参考。
首先,M-V- X 本质都是一样的 重点还是在于M-V 的桥梁。要靠 X来牵线,X的模式之间不同 主要是 M与V 的数据传递的流程不同。数据传递的流程不同来源于运行环境技术栈能够做到的事情不同。所以无论是复杂化 简单化 还是修改流程,基本都是因为技术栈变化了 对应做的调整。先大致了解Android开发中常见的模式,以便我们更深入了解MVVM 模式。

  • MVC

    View:对应于xml布局文件
    Model:实体模型
    Controllor:对应于Activity业务逻辑,数据处理和UI处理

    从上面看起来各个组件的职责视乎还挺耦合MVC的,但是打开Android的一个Activity文件,一看一言难尽, Android中经常会出现数千行的Activity代码,究其原因,Android中纯粹作为View的各个XML视图功能太弱,Activity基本上都是View和Controller的合体,既要负责视图的显示又要加入控制逻辑,承担的功能过多,代码量大也就不足为奇。所有更贴切的目前常规的开发说应该是View-Model 模式,大部分都是通过Activity的协调,连接,和处理逻辑的。






    图一:




    =======================================================================================================================






    图二:

  • MVP

    View: 对应于Activity和xml,负责View的绘制以及与用户交互
    Model: 依然是实体模型
    Presenter: 负责完成View于Model间的交互和业务逻辑

    在Android开发中MVP的设计思想用得比较多,利用MVP的设计模型可以把部分的逻辑的代码从Fragment和Activity业务的逻辑移出来,其中,Presenter的实现有2种方式,一种在Presenter中持有View(Activity或者Fragment)的引用,然后在Presenter调用View暴露的接口对视图进行操作,这样有利于把视图操作和业务逻辑分开来。还有一种在界面View(Activity或者Fragment)依赖一个已经定义好接口,里面既有数据获取又有数据显示,仅仅是接口而已,符合面向接口编程,依赖抽象的设计思想,而Presenter也只是实现约定的接口而已,对比第一种减少View对Presenter的强藕依赖。所有这些是为了让Activity成为真正的View而不是View和Control的合体,Activity只做UI相关的事。但是这个模式还是存在一些不好的地方,比较如说:

    • Activity需要实现各种跟UI相关的接口,同时要在Activity中编写大量的事件,然后在事件处理中调用presenter的业务处理方法,View和Presenter只是互相持有引用并互相做回调,代码不美观。
    • 这种模式中,程序的主角是UI,通过UI事件的触发对数据进行处理,更新UI就有考虑线程的问题。而且UI改变后牵扯的逻辑耦合度太高,一旦控件更改(比较TextView 替换 EditText等)牵扯的更新UI的接口就必须得换。
    • 复杂的业务同时会导致presenter层太大,代码臃肿的问题。



  • MVVM

    View: 对应于Activity和xml,负责View的绘制以及与用户交互
    Model: 实体模型
    ViewModel: 负责完成View于Model间的交互,负责业务逻辑

    MVVM的目标和思想MVP类似,利用数据绑定(Data Binding)、依赖属性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一个更加灵活高效的架构。

  • 数据驱动
    在MVVM中,以前开发模式中必须先处理业务数据,然后根据的数据变化,去获取UI的引用然后更新UI,通过也是通过UI来获取用户输入,而在MVVM中,数据和业务逻辑处于一个独立的View Model中,ViewModel只要关注数据和业务逻辑,不需要和UI或者控件打交道。由数据自动去驱动UI去自动更新UI,UI的改变又同时自动反馈到数据,数据成为主导因素,这样使得在业务逻辑处理只要关心数据,方便而且简单很多。
  • 低耦合度
    MVVM模式中,数据是独立于UI的,ViewModel只负责处理和提供数据,UI想怎么处理数据都由UI自己决定,ViewModel 不涉及任何和UI相关的事也不持有UI控件的引用,即使控件改变(TextView 换成 EditText)ViewModel 几乎不需要更改任何代码,专注自己的数据处理就可以了,如果是MVP遇到UI更改,就可能需要改变获取UI的方式,改变更新UI的接口,改变从UI上获取输入的代码,可能还需要更改访问UI对象的属性代码等等。
  • 更新 UI
    在MVVM中,我们可以在工作线程中直接修改View Model的数据(只要数据是线程安全的),剩下的数据绑定框架帮你搞定,很多事情都不需要你去关心。
  • 团队协作
    MVVM的分工是非常明显的,由于View和View Model之间是松散耦合的。一个是处理业务和数据,一个是专门的UI处理。完全有两个人分工来做,一个做UI(xml 和 Activity)一个写ViewModel,效率更高。
  • 可复用性
    一个View Model复用到多个View中,同样的一份数据,用不同的UI去做展示,对于版本迭代频繁的UI改动,只要更换View层就行,对于如果想在UI上的做AbTest 更是方便的多。
  • 单元测试
    View Model里面是数据和业务逻辑,View中关注的是UI,这样的做测试是很方便的,完全没有彼此的依赖,不管是UI的单元测试还是业务逻辑的单元测试,都是低耦合的。

通过上面对MVVM的简述和其他两种模式的对比,我们发现MVVM对比MVC和MVP来说还是存在比较大的优势,虽然目前Android开发中可能真正在使用MVVM的很少.

通过一系列的学习,消化和参考。目前,MVC,MVP都已经应用到项目开发中了。
关于MVVM目前是只闻其声,不见其下楼。MVVM算是舶来品,从Web前端的Argular而来。Argular有个databind的属性领我们羡慕不已,瞬间感觉高大上啊!
其实,还有WPF,这个落寞巨人微软的背影。这个有个点感觉很牛逼就是,界面开发和业务开发完全分开实现。界面开发除了数据是假的,业务操作绑定,显示全是真的,业务流程的定义和界面设计进行了解耦,二者通过接口文档,默认命名规则进行约定实现。最后界面显示和业务处理拼合起来就好了。
我觉得除了databind (现在有robobinding可以参考),还需要 有事件订阅与发布 的模块(推荐使用使用facebook的flux),相关技术用到RxJava,RxAndroid的模块。
而后再加上代码自动生成,通过web服务器的数据库,直接生成业务处理代码与接口,Android端也自动生成业务处理类。着多牛逼啊,然后Android开发失业。web开发失业。数据库设计和界面开发笑到了最后。
这都是我们对于mvvm的自嗨和幻想+YY,Google大兄弟目前还没有推荐的技术实现。感觉Google处境很尴尬,现在Facebook 推出的 React Native 如日中天,大有替代Java 原生编程的趋势。如果真取代了,Android Application 将是 Node.js JavaScript的乐园。我们原生应用的开发工程师可要下岗了。目前已经在不断蚕食Android原生开发的份额,通过Cordova这个内奸,Html5家族由原来的jQuery Mobile 到 Augular.js 和ionic,再到 React 和 React Native,来势汹汹。JS是如日中天,蓬勃发展。再回来讨论MVVM竟然是前端带来的技术。遇见的未来竞争会更激烈。广大Android原生开发的从业者受的的冲击会更大。

整理自:https://www.zhihu.com/question/20148405/answer/113094779
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值