MVC / MVP / MVVM 架构模式

  1. MVC / MVP / MVVM 架构模式

    Android架构,即为开发Android时使用的架构。Android的开发一般分为三部分:UI逻辑,业务逻辑和数据操作逻辑。

    Android架构,就是为了更好地协调这三者的关系。达到:

    • 各模块高内聚低耦合的状态,方便进行团队分工合作开发。

    • 代码思路清晰,提高代码的可维护性与可测试性。

    • 减少样板代码,提高开发效率,减少开发错误。

    MVC

    Android上的MVC架构我认为是来源于web开发的SpringMVC,MVC全名为Model-View-Controller,图解如下:

    0

    View:负责与用户交汇,显示界面。

    Controller:负责接收来自view的请求,处理业务逻辑。

    Model:负责数据逻辑,网络请求数据以及本地数据库操作数据等。

    在MVC架构中,Controller是业务的主要承载者,几乎所有的业务逻辑都在Controller中进行编写。而View主要负责UI逻辑,而Model是数据逻辑,彼此分工。

    MVC的本质就是按照UI逻辑、业务逻辑、数据操作逻辑不同的职责分三大模块,彼此分工。

    在Android中,View一般使用xml进行编写,但xml的能力不全面,需要Activity进行一些UI逻辑的编写,因而MVC中的V即为xml+Activity。Model数据层,在Android中负责网络请求和数据库操作,并向外暴露接口。Controller是争议比较多的写法:一种是直接把Activity当成Controller;一种是独立出Controller类,进行逻辑分离。比较符合MVC思想的笔者认为是后者。因为前者直接在Activity中进行书写业务逻辑就会和UI逻辑混合在一起了,达不到模块分工的效果。

    优点:简单。他不需要写很多的代码来让代码解耦,这在小型项目非常有用。小型项目总体的代码就不多,所以这样可以提高开发效率。

    缺点:

    几乎所有的业务逻辑代码都在Controller中进行,会导致非常臃肿,降低项目的可测试性与可维护性。

    View直接持有Controller和Model实例,不同职责的代码进行耦合,导致代码耦合性高,模块分工不清晰。

    改进方向:

    对模块进行更加彻底的分离,不要让View和Model直接联系。对Controller进行减压。

    MVP

    相比MVC,MVP的更加的完善。MVP全名是Model-View-Presenter。图解如下:

    0
    • View:UI模块,负责界面显示和与用户交汇。

    • Presenter:负责业务逻辑,起着连接View和Model桥梁的作用。

    • Model:专注于数据操作逻辑。

    MVP 和 MVC 的区别很明显就在这个Presenter中。为了解决MVC中代码的耦合严重性,把业务逻辑都抽离到了Presenter中。这样View和Model完全被隔离,实现了单向依赖,大大减少了耦合度。View和Prensenter之间通过接口来通信,只要定义好接口,那么团队可以合作同时开发不同的模块,同时不同的模块也可以进行独立测试。也因各模块独立了,所以要只要符合接口规范,即可做到动态更换模块而不需要修改其他的模块。

    在Android中,需要让Activity提供控件的更新接口,Prensenter提供业务逻辑接口,Activity持有Presenter的实例,Presenter持有Activity的弱引用(不用直接引用是为了避免内存泄露),Activity直接调用Presenter的方法更新界面,Presenter去Model获取数据之后,通过View的接口更新View。

    0

    不同的View可以通过实现相同的接口来共享Prensenter。Prensenter也可以通过实现接口来实现动态更换逻辑。Model是完全独立开发的,向外暴露的方法参数中含有callBack参数,可以直接调用callBack进行回调。

    优点:

    • MVP通过模块职责分工,抽离业务逻辑,降低代码的耦合性

    • 实现模块间的单向依赖,代码思路清晰,提高可维护性

    • 模块间通过接口进行通信,降低了模块间的耦合度,可以实现不同模块独立开发或动态更换

    缺点:

    • 过度设计导致接口过多,编写大量的代码来实现模块解耦,降低了开发效率

    • 并没有彻底进行解耦,Prensenter需要同时处理UI逻辑和业务逻辑,Prensenter臃肿

    MVVM

    MVVM和上面两种架构模式一样都是一种架构思想,只是谷歌推出了jetpack架构组件来让我们更好的使用这种架构模式。

    MVVM,全名为Model-View-ViewModel。

    0
    • View:和前面的MVP、MVC中的View一样,负责UI界面的显示以及与用户的交汇。

    • Model:同样是负责网络数据获取或者本地数据库数据获取。

    • ViewModel:负责存储View的数据映像以及业务逻辑。

    MVVM的View和Model和前面的两种架构模式是差不多的,重点在ViewModel。ViewModel通过将数据和View进行绑定,修改数据会直接反映到View上,通过数据驱动型思想,彻底把MVP中的Presenter的UI操作逻辑给去掉了。而ViewModel是绑定于单独的View的,也就不需要进行编写接口了。但ViewModel中依旧有很多的业务逻辑,但是因为把View和数据进行绑定,这样可以让View和业务彻底的解耦了。View可以专注于UI操作,而ViewModel可以专注于业务操作。因而MVVM通过数据驱动型思想,彻底把业务和UI逻辑进行解耦,各模块分工职责明确

    缺点:

    MVVM的ViewModel依旧很臃肿。

    MVVM需要学习数据绑定框架,具有一定的上手难度。

    适合android开发的MVVM架构模式:

    0

    简单的解析:

    View对应的就是Activity和Fragment,在这里进行UI操作。

    ViewModel中包含了LiveData,这是一种可观察数据类型框架。View通过向LiveData注册观察者,当LiveData发生改变时,就会直接调用观察者的逻辑把数据更新到View上。

    ViewModel完全不需要关心UI操作,只需要专注于数据与业务操作。

    Repository代表了Model层,Repository对ViewModel进行了减压,i把业务操作般到了Repository中,避免了ViewModel臃肿。

    Repository对请求进行判断是要到本地数据库获取还是网络请求获取分别调用不同的模块。

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

推荐阅读更多精彩内容