Android几种架构模式-MVC+MVP+MVVM

  • 对于我们 Android 开发者来说,常见的架构模式基本上就是 MVC,MVP,MVVM,这三种也是开发 GUI 应用程序常见的模式。除此之外还有 分层模式,客户端-服务器模式(CS模式),主从模式,管道过滤器模式,事件总线模式 等等。这篇文章还是具体分析 MVC,MVP,MVVM 这三种架构模式。

1. Modle

无论在那个架构模式中,Model都是不变的,Model类封装了数据模型和相应的网络操作等

Model

  • 首先看看MVC(纯属个人理解)

在这里说的是Android开发中类似

xml(view)
activity(controller)
model

MVC

正解:当用户出发事件的时候,view层会发送指令到controller层,接着controller去通知model层更新数据,model层更新完数据以后直接显示在view层上,这就是MVC的工作原理。

个人理解:简单来说,controller就是model和VIew的中间件,视图的相关变化需要根据Model来的数据进行相应的变化,而model层需要从controller层获取数据,Veiw层变化直接使用model层的数据

比如你的界面有一个按钮,按下这个按钮去网络上下载一个文件,这个按钮是view层的,是使用xml来写的,而那些和网络连接相关的代码写在其他类里,比如你可以写一个专门的networkHelper类,这个就是model层,那怎么连接这两层呢?是通过button.setOnClickListener()这个函数,这个函数就写在了activity中,对应于controller层。是不是很清晰。
>> 总结:对于这种架构模式,如果我们的项目很小(几百行代码量),代码量不多,其实还是非常好的架构,但项目比较复杂的时候就不推荐这个架构了,因为他的逻辑代码全部都在controller中(activity或者fragment),这就会显得activity非常的臃肿,也不好进行维护、管理

xml作为view层,控制能力实在太弱了,你想去动态的改变一个页面的背景,或者动态的隐藏/显示一个按钮,这些都没办法在xml中做,只能把代码写在activity中,造成了activity既是controller层,又是view层的这样一个窘境。大家回想一下自己写的代码,如果是一个逻辑很复杂的页面,activity或者fragment是不是动辄上千行呢?这样不仅写起来麻烦,维护起来更是噩梦。所以MVP架构来了
  • 看看MVP

(盗图)


image.png

MVP

其实不难发现:这就是java中经典的数据回调的操作。由于activity和Model之间不直接通信,(只可远观而不可亵玩)所以让presenter作为一个中间件可以很好的解决这个问题。打个形象的比喻:就像织女和牛郎只能通过鹊桥才能获取双方的信息一样。presenter就相当于这个鹊桥。
【注意这里是presenter和View】但视图层却也不认识presenter,presenter也不认识视图层,所以他们两个必须得知道对方的信息才能实现,他们之间必须建立联系,(分别得到对方的一个对象,万物皆对象),但这样还不够,知道对象却也不知道他有什么方法,就好比你找了个男朋友,只知道他的人,却不知道他有多少钱。但你又必须知道他有多少钱,你才能用他的钱,这个时候,接口(银行)就出现了,大家都知道这个接口(银行)而你的男朋友必须把钱存入银行(实现这个接口),你知道男朋友的身份信息就可以拿着去银行查询他有多少钱(查看presenter接口中的方法,而presenter实现类必定具有里面的方法),最终达成目的。

实现过程view视图将逻辑判断等代码放入到presenter中,再由presenter传到Model中;而Model中的数据传过来也是先在presenter中,再写入到View中相应的位置显示即可。

总结:其实认真体会就会发现MVP还是很不错的,他将View层变得简单,不再有冗余的代码,不再有大量逻辑代码,而将这些代码统统放进了presenter里面,使程序的维护的难度降低,不再用去读Activity中看花眼睛的代码,直接在presenter中修改相应的接口函数即可。

  • MVVM架构模式

要了解MVVM,首先我们得了解ViewModelliveData
ViewModel官网网址:https://developer.android.com/topic/libraries/architecture/viewmodel?hl=zh-cn
livaData官网网址:
https://developer.android.com/topic/libraries/architecture/viewmodel?hl=zh-cn

ViewModel类是被设计用来以可感知生命周期的方式存储和管理 UI 相关数据,ViewModel中数据会一直存活即使 activity configuration发生变化,比如横竖屏切换的时候。我们知道在屏幕旋转的 时候 会经历 activity 的销毁与重新创建,这里就涉及到数据保存的问题,显然重新请求或加载数据是不友好的。在 ViewModel 出现之前我们可以用 activity 的onSaveInstanceState()机制保存和恢复数据,但缺点很明显,onSaveInstanceState只适合保存少量的可以被序列化、反序列化的数据,假如我们需要保存是一个比较大的 bitmap list ,这种机制明显不合适。由于 ViewModel 的特殊设计,可以解决此痛点。先来看下 ViewModel 生命周期图:
ViewModel

关于View Model具体什么时候被销毁?

  • 其实看到这里我已经有点疑惑了,仔细看:


    ViewModel什么时候被销毁
  • 同样都是生命周期中的onDestroy为什么上一个没有没有销毁ViewModel而下一个却销毁了呢?

下面给出解释:

当Activity 处于前台的时候被销毁了,那么得到的 ViewModel 是之前实例过的 ViewModel;如果 Activity 处于后台时被销毁了,那么得到的 ViewModel 不是同一个。举例说,如果 Activity 因为配置发生变化而被重建了,那么当重建的时候,ViewModel 是之前的实例;如果因为长期处于后台而被销毁了,那么重建的时候,ViewModel 就不是之前的实例了。而上一个onDestroy是前台的销毁,而后一个是后台的onDestroy

开始正式讲解MVVM

先看下图:


MVVM
  • 思路:view给VM传数据是通过VM中定义的一系列方法,通过调用方法传递数据到VM中,而VM将得到的数据进行处理,传到model层,而View怎么更新ui呢?---》监听VM中的livadata对象,livadata对象一改变说明数据有变动就将新数据更新到ui上,相当于livedata不变我就不更新ui,livadata改变就更新ui
image.png

学习时间仓促,后期会修正其中说的不太对的地方。

推荐一篇博客写的不错https://blog.csdn.net/wo_ha/article/details/55519224

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,362评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,577评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,486评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,852评论 1 317
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,600评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,944评论 1 328
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,944评论 3 447
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,108评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,652评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,385评论 3 358
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,616评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,111评论 5 364
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,798评论 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,205评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,537评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,334评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,570评论 2 379

推荐阅读更多精彩内容