用一个最简单的登录例子来了解Android的MVC和MVP架构的原理和实现

在目前的Android开发中,MVP与MVC架构还有MVVM都非常流行,三者在不同的场景下都有各自的优势和劣势,一般而言会根据具体的业务场景来选择不同的模式,所以并不是说开发一个App一定完全遵循那种模式,完全可以根据业务场景不同混合多种模式。
从概念上讲,MVP和MVC虽然都含有Model和View,但是Model和View的职责并不相同。下面是MVC和MVP的结构示意图


image.png

image.png

在MVC中,箭头的方向A->B可以简单的理解为A在代码中出现了B,例如Controller->Model,可以理解为Activity有一个成员变量User,Controller<->View可以理解为activity中有一个成员变量textview,textview也持有context(activity)这个对象。
而在MVP中,View和Model完全分离,通过中间的Presenter来传递消息。

Android的MVC并不是严格标准的MVC。
在Android中,通常而言M指的是数据模型(model类),V指的是XML文件和各种View组件,Controller则是Activity,Fragment这些带有生命周期的具体业务类。可是,Activity天生并不适合做Controller,因为View一定会在Activity中进行绑定(findviewbyid),所以Activity不可避免的还要做一些MVC中View的工作。因此,在Android的MVC中,Activity即是View又是Controller。这就导致了在一个业务复杂的Activity中,存在一大堆业务代码和UI控制代码,显的很臃肿,不利于维护和测试。

MVP可以很好的解决这个问题,在MVP中,我们就让Activity做一个纯粹的View,把具体的业务都剥离出去让Presenter做,每一个Presenter做不同的业务,这样就很方便维护和测试。

拿一个非常简单的登录界面来讲,我们现在要完成一个简单的业务,输入账号密码登录。
我们要完成四个功能:密码为空给出提示,账号为空给出提示,登录失败给出提示,登录成功显示欢迎xxx。


login.gif

首先是使用MVC来完成这个业务,Api是一个模拟登录Api的类,SimpleDialog简单的封装了Dialog,可以忽略这些,具体代码可到文章末尾github地址查看。
在这个Activity即Controller中,持有了Model和一些View,同时Controller也做了部分View的工作。


image.png

再来是MVP模式,一个最简单的MVP模式由IView接口类(定义界面什么时候改变),Presenter(具体业务)和一个Activity(界面显示+控制)组成,如下面三张图的代码所示。
我们发现,在这个MVP模式的Activity中,Api的请求没有了,非法账号密码的判断也没有了,而且Activity不再持有model类(user对象),activity只调用了presenter的具体业务方法,然后这些全由presenter负责,Activity现在看起来完全是一个View,只管怎么显示界面。

image.png

当presenter完成业务后,势必要通知Activity对UI进行更改,我们定义了一个ILoginView接口,它确定了有哪些情况需要更改View,非常清晰。下面是ILoginView的代码,这四个接口分别是登录成功后ui的更改,因为登录成功后需要显示用户名字,所以传递了String的参数,其余三个为登录失败,非法的密码和非法的账号ui更新接口,根据业务的需要可以扩充这个接口和参数。
image.png

接下来看看最神奇的presenter类,其实presenter也并没有那么神奇,仅仅是把MVC中activity的业务代码挪到了这里面,在这个presenter中,一定要传入ILoginView这个接口,同时现在他持有了Model(即user对象)而不再是Activity持有User,在LoginPresenter完成登录业务后,调用IlongView接口来通知Activity更改页面。
image.png

现在回过头去看最初的结构图,应该能大致明白MVP的结构了吧。
MVP的好处就是剥离一个个业务,想象一下如果在这个界面增加注册,找回密码等业务,只要多增加几个presenter就可以了,而传统的MVC,把所有代码挤在Activity里,整个Activity是不是已经显的臃肿不堪。
项目地址
https://github.com/ccyzml/LoginCaseOnMVPMVC

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

推荐阅读更多精彩内容