引言:

Android框架的发展的过程就是一个不断化繁为简的过程,大家都在研究如何正确方便高效的规范代码。当然这条路也永远不会停止,就像新的芽儿,随着时间的流逝,每天都在长出新的枝叶,每天都在成长。对于技术,每次新框架的提出都在剔除旧框架的诟病和痛点,演变成更方便,更高效,更简洁的新框架,然后新的框架在具体使用中又会带来新的诟病和痛点,反反复复,无穷尽也......从开始使用MVC到使用MVP,从MVP到MVVM,每次框架的提出都有让我们眼前一亮的东西,但具体使用中确还是存在很多的痛点,似乎一直存在一种反作用力来阻止我这样做。但又能怎样?新的芽儿注定会长成参天大树,技术终究只会进步。

概述

MVC

MVC这里就不多说了,大家都熟悉的不能再熟悉了,比较古老的框架了,相信大家也都使用过;

MVC具体使用

  • Model:数据模型,JavaBean

  • View:layout布局文件

  • Control:Activity,处理数据请求,业务逻辑

MVC的诟病

  • View和Control耦合严重,Activity中存在大量的逻辑代码,Activity既是View,又是Control,结构不清晰,Activity中内容太多

MVP

MVP是在MVC的基础上把Control独立出来的模型,简化Control的内容,这里Presenter充当中间代理的角色,view和Model不直接交互,而是通过Presenter

MVP的具体使用

  • Model:实体模型,JavaBean

  • View:Activity和Layout

  • Presenter:View和Model通过Presenter交互

MVP的诟病

  • 粒度很难把握,使用过MVP的都知道,MVP模型需要定义比较多的接口,View需要定义接口,presenter需要定义接口,以前我们使用一个activty能解决的问题,现在要将一个Activity分解成一个View,一个Preseter,一个Model,每个模块都需要使用接口来实现解耦,这样就会导致有时候一个activity中涉及的业务比较多,按每个业务点搭建MVP模型的话,会导致原来一个Activity类能搞定的,现在需要扩展成多个接口,多个类才能实现;粒度大的话,可能结构不清晰;粒度小的话,代码量又会比较大;

  • MVP是以UI和事件为驱动的模型,数据的获取是被动的根据UI变动的,我们更希望是数据变化去更新UI,而不是反过来;

  • Presenter和View耦合度比较高;

  • Presenter类在业务比较复杂情况下,代码量比较大;

MVVM

MVVM是在MVP的基础上,根据谷歌提出的DateBinding方案重新设计的一个灵活高效的框架,MVVM使用ViewModel一层代替原来的Presenter层;

MVVM的使用

  • Model:数据模型,JavaBean

  • View:Activty和Layout

  • ViewModel:View和Model业务逻辑交互

MVVM的优点

数据驱动

在MVVM中,数据的变化可以自动更新view,不需要获取view的引用;

耦合较低

MVP模式中View和Presenter是强耦合的,Presenter需要拿到View的引用,这样当View变动时,Presenter也需要变化,耦合度太高;现在MVVM中,ViewModel只负责数据和业务,View的变化,ViewModel不需要关系,数据变化,View自动更新,耦合度比较低;

View更新

MVVM模型中不用考虑是否在主线程中更新UI,DateBinding会负责在主线程中更新UI的,我们不用担心线程的问题,简单的不止一点点;

可重复利用

一个ViewModel就是一个数据源,可以将一个ViewModel绑定到不同的View中,就可以达到更新view目的

MVVM的诟病

  • MVVM由于是基于google的DataBinding框架的,而DataBinding支持的绑定View还比较少,因此在使用的过程中可能会遇到某些view无法使用DateBinding的情况,这点也是我之前没有使用MVVM的原因

  • 既然存在上面的问题,国内外的大牛已经帮我们封装好了一套使用dateBinding的view库,为避免重复造轮子,我们可以将它引入到我们的项目中直接使用,目前我知道的已经支持常用所有View;

总结

经过上面对不同框架的对比,相信大家都有一个基本的了解,有人会问这么多框架,我们使用那个比较好呢?

个人觉得,技术是在不断进步,旧的框架最终都会被新的框架所代替,我觉得MVVM的提出解决了我们使用其他框架的很多痛点,我觉得使用MVVM会更好点。

Android 设计模式对比的更多相关文章

  1. Android设计模式系列

    http://www.cnblogs.com/qianxudetianxia/category/312863.html Android设计模式系列(12)--SDK源码之生成器模式(建造者模式) 摘要 ...

  2. Android设计模式(五岁以下儿童)--简单工厂模式

    1.面试的时候问这个问题: 在ListView 的item小程序.很多不同的显示风格.或者是,为了更好地维护,不同的样式,应该怎么做? 我一下就想到的是工厂的模式,利用project,编写ViewFa ...

  3. Android 设计模式之MVC模式

    说到Android设计模式的MVC模式,估计很多人都是比较熟悉了,这里深入了解一下MVC到底是怎么回事,以ListView为例子讲解. 一.深入理解MVC概念 MVC即Model-View-Contr ...

  4. 经常使用的android设计模式

    一般来说,经常使用的android设计模式有下面8种:单例.工厂.观察者.代理.命令.适配器.合成.訪问者.   单例模式:目的是为了让系统中仅仅有一个调用对象,缺点是单例使其它程序过分依赖它,并且不 ...

  5. Android设计模式源码解析之桥接模式

    模式介绍 模式的定义 将抽象部分与实现部分分离,使它们都可以独立的变化. 模式的使用场景 如果一个系统需要在构件的抽象化角色和具体化角色之间添加更多的灵活性,避免在两个层次之间建立静态的联系. 设计要 ...

  6. Android 设计模式一:EIT造型

    前言:首先不提造型,我们先来学习公式. 思绪回到于十七世纪中,牛顿提出了简单公式:F=ma:让人们能轻易理解物体运动的复杂<关系>. 再如,于二十世纪初,爱因斯坦发表了简单公式:E=MC平 ...

  7. Android 设计模式 之 单例模式

    http://blog.csdn.net/fangchongbory/article/details/7734199   目录(?)[+] 单例模式常见情景 首先实现1中的单例模式A 实现2中单例模式 ...

  8. Android 设计模式

    简介 项目开发中发现问题.解决问题这个过程中会出现很多问题,比如重复出现.某个问题的遗留,这些问题的本质就是设计模式.今天记录设计模式的知识点. 内容 在java以及其他的面向对象设计模式中,类与类之 ...

  9. 【Android车载系统 News | Tech 3】News 从手机征战到汽车 Android Auto对比CarPlay 2014-12-29

    Google和苹果都试图给用户的汽车带来一个安全和友好的移动体验.Android Auto和CarPlay是这两家公司推出的专为车载而重新设计的移动用户界面,双方目前都在筹备着在明年正式大规模推广. ...

随机推荐

  1. 【app】adb连接问题整理

    如果使用adb devices进行检测,发现没有任何设备信息,我们就需要检查是否有手机/模拟器连接上 如果是手机进行连接,windows右下角有出来如下提示的话,需要检查你的手机驱动是否有安装好 如果 ...

  2. Excel 逻辑函数if使用方法

    Excel 逻辑函数if使用方法

  3. .Net Self Hosting 的几种方式

    写在前面: IIS是Windows平台非常关键的组件,它是微软自带的Web服务器,可以很方便的帮助我们运行起一个网站,WebApi等服务,提供给外部来访问.即使它被很多java或者ruby的同学各种鄙 ...

  4. 【原创】VirtualBox 磁盘扩容教程

    问题和环境说明 环境: 主机:Ubuntu 15.10 客户机:Windows 7 x64 VirtualBox:5.0.10 虚拟机磁盘类型:VDI(VirtualBox磁盘映像) 问题: 在虚拟机 ...

  5. jvm的那些设置参数你都知道吗

    前言 大家都知道,jvm在启动的时候,会执行默认的一些参数.一般情况下,这些设置的默认参数应对一些平常的项目也够用了.但是如果项目特别大了,需要增加一下堆内存的大小.或者是系统老是莫明的挂掉,想查看下 ...

  6. 一览js模块化:从CommonJS到ES6

    本文由云+社区发表 模块化是指把一个复杂的系统分解到一个一个的模块. 模块化开发的优点: (1)代码复用,让我们更方便地进行代码管理.同时也便于后面代码的修改和维护. (2)一个单独的文件就是一个模块 ...

  7. JavaScript中常见的十五种设计模式

    在程序设计中有很多实用的设计模式,而其中大部分语言的实现都是基于“类”. 在JavaScript中并没有类这种概念,JS中的函数属于一等对象,在JS中定义一个对象非常简单(var obj = {}), ...

  8. 第7章 Linux上配置RAID

    7.1 RAID概念 RAID独立磁盘冗余阵列(Redundant Array of Independent Disks),RAID技术是将许多块硬盘设备组合成一个容量更大.更安全的硬盘组,可以将数据 ...

  9. (2)编译安装lamp三部曲之mysql-技术流ken

    简介 采用yum安装lamp简单,快捷,在工作中也得到了普遍应用.但是如果我们需要某些特定模块功能,以及制定安装位置等,就需要用到编译安装了,接下来将编译安装lamp之mysql. mysql的简介网 ...

  10. 南大算法设计与分析课程OJ答案代码(1)中位数附近2k+1个数、任意两数之和是否等于给定数

    问题1 用来测试的,就不说了 问题2:中位数附近2k+1个数 给出一串整型数 a1,a2,...,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及 ...