TODO-MVP 深入浅出

转载请说明出处 http://www.jianshu.com/p/bbbff64486e5

该工程是谷歌官方推荐学习MVP应该熟悉的项目Github官方地址 

看下Gif吧,从视觉上感受下。


声明:本文提供的图片,为防止有人感觉不适,部分地方打码  :-)

项目本身做的事情非常简单,四大模块,添加任务,任务列表,任务详情,统计列表。但该项目写的非常标准,并且我看到了很多好玩的东西,开发者需要熟练掌握,想学好这几个方面还得下足功夫。我会单独标注,整体包结构(示意图标注直观清晰表达):



todo-mvp整体包结构

Model :   所属包  data

View : 所属为每个功能模块包。 (我们通常会这样创建包结构,比如这里添加任务模块,里面就包含了以Fragment做为的View)

Presenter:  亦所属功能模块包。

再提一次,该工程有四大功能

addTask    添加任务

Tasks       任务列表

TaskDetail   任务详情

Statistics   任务统计

我之所以打开AddTask,是因为展示View和Presenter这个结构最纯粹,最具代表性。再来熟悉一下MVP 原文地址


MVP模式讲解


View与Presenter可以双向通信,协议是Interface实现,以Contract命名结尾的。比如AddTask包下的 AddTaskContract

AddTaskActivity是创建Fragment与Presenter的。用Fragment做为View(Activity也可以)是因为更加纯粹,有时我们也不用严格去这么做。

AddTaskPresenter是控制器。

我们首先学会了通过类名来区分每个角色,这样学习其他功能,比如任务列表,任务详情,统计信息模块,是完全一样的。看下图:

AddTaskContract 协议,定义View与Model的需求、功能,来看


Contract定义M与V协议

好处是功能清晰,维护简单,方便管理

继续看下一般结构


四个功能模块

好了,View与Presenter讲清楚了,现在开始讲Model。Model略微复杂,你看看嘛


Model示意图

我所理解的Model不仅对外提供数据,并且定义数据类型。

Task  :    任务实体类

          TasksDataSource: 是Model与对外暴露的协议,让他人知道Model可以提供哪些功能


TaskDataSource( Model 与 Presenter的桥梁)

       TaskRepository: 真正实现TaskDataSource接口的类。来看张类图


具体做的工作分给 TaskLocalDataSource 与 TaskRemoteDataSource


local 本地数据源,SQLiteDB形式。

         TaskDbHelper : 看后缀DbHelper肯定是帮助类,用于记录的增删改查的

         TaskLocalDataSource : 具体提供Model功能

          TasksPersistenceContract:定义DB中一些常量,如表字段 如图


DB协议类(我常用接口来做这件事)

Remote为远程数据源

          TaskRemoteDataSource:   模拟network提供数据源


OK,截至到现在,该工程的MVP角色我都讲了,源码具体实现,感兴趣的可以去官网下载。本人也大概浏览了一下,翻译了一些注释。无奈没找到简书上传文件功能,无法分享了。如果真的很需要请入Q群并注明 473930845  最纯粹的技术交流群体


util :  工具箱

BasePrsenter : 基础Presenter,只有一个方法start(),并且这个方法是在Fragment的onResume()中调用的,其实就一个作用,告诉Presenter,Fragment开始工作了,View对用户可以见了, 你可以做一些业务动作了。所以,我们也可以灵活的根据需求,当Fragment对用户不可见时,通知Presenter。


BaseView :只有一个方法 setPresenter(T presenter) 看名字就知道了,拿到Presenter引用,用于     V - >  P 的指令

BaseView


那么如果  p -> V 的指令想要发送, 一定是Presenter拿到View的引用,怎么拿?“创建Presenter的时候把当前View传递过去”  简单暴力。 看代码


Activity作为View与Presenter的管理者,很适合这个工作。但我看过很多MVP工程,包括我自己的,把Activity作为View

好的,到目前为止,整个项目的架构讲解完成,做到了先整体再局部。

接下来我们看一些有意思的实现(这可是GoogleSample)值得借鉴的,我会放在另外几篇文章中,因为具有通用性

1.   MVP好在于分层测试,这个项目中有单元测试,UI测试。基于本项目学习下

2.  .gradle脚本的配置 技巧。 基于本项目学习下

完结

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

推荐阅读更多精彩内容