使用 MVP 时在设计上的考量

在“FluxJava: 给 Java 使用的 Flux 库”这篇文章中提到,设计中使用 MVP 最大的问题,是会让不同的画面形成一组、一组的 Class,但各组之间是独立的。MVP 最基本的设计概念中,只描述了同一组内 Class 如何互动,并没有提到组内的 Class 如何跨组与其他的 Class 互动。当设计上出现要跨组的情况时,就得要仰赖设计者的功力与经验了。

就 MVP 的精神,View 要负责的工作,只是把 Presenter 送来的 Model 内容呈现在画面上。并且,与使用者互动,接收使用者的意图、收集使用者输入的数据,再交由 Presenter 处理。至于其他与 Business Logic 有关的事,不会由 View 来经手。

画面的切换由谁负责

在只有单一画面的情况之下,看起来很合理、分工明确,在设计上应该是个无可挑剔的方案。只是当画面一多起来,随之出现了一个问题:画面的切换由谁负责?

有问题吗?View 是负责使用者互动的,当然画面的转换由 View 来做啰!

也对,以 Android 平台为例,发送 Intent 大多是在 Activity 或是 Fragment 上处理的,再自然不过了。等新的 View 被载入后,再去启动与其配对的 Presenter、让 Presenter 把数据送过来。流程上都还在设计的预想之内,跨组的工作的确就由 View 来完成即可。

在画面与画面的顺序固定的情况下,看起来是没什么问题。如果画面的切换要依据数据的状态来决定呢?

刚才有提到,为了保持每个 Class 任务的单纯性,View 应该与 Business Logic 无关。要让 View 根据数据状态来决定,某种程度上就是 Business Logic,这样是不是违反了一开始提到的精神?

而且判断时所依据的数据,很可能跟 View 要显示的内容无关,又或者是一个复杂的逻辑,又更加深了是否该放在 View 上的疑虑。

Presenter 是否要跨平台

不放在 View 又要放在哪?Presenter 上吗?

这应该是在简单的 MVP 结构之下,大多数人的选择。当整个结构中,就只有 Model、View、Presenter,自然是只能由 Presenter 来存取数据库、负责数据处理逻辑。此时再多加一项,依据数据决定画面切换方式,好像也没有什么不恰当。

先回到 Android 平台上,来看看这样的安排会出现什么情况。

Presenter 要能够控制 Activity 的转换,必须要取得 Context,这也意味着 Presenter 与 Android 平台绑在一起。所以当这样的设计内容,要移到不同的平台上,Presenter 就有可能要面临大幅度在设计上的修改。换句话说就是,把工作放在 Presenter 上,会将设计限制在特定的平台上。

把 Context 排除在 Presenter 之外,就可以避免这个问题了吗?

就算是 Presenter 不直接控制 Activity 的转换,只决定要切换哪一个 Activity,Presenter 势必要有 Activity 的资讯,不管是 Type 或是 Class 名称。换了一个平台,显示画面的 Class 还会是相同的名称吗?可以确定的是 Type 一定不一样。

MVP 套用在 Android 上的问题

那就不要跨平台,大不了新的平台把设计再重做一次!

其实对 Android 平台来说,问题还不止如此。以 Master-Detail 的画面配置当例子,不同屏幕尺寸的情况下,会有一个 Activity 和二个 Activity 的差别。

原本在大屏幕中,一个 View、一个 Presenter 就做完的事,到了小屏幕却变成二个 View,那 Presenter 也要跟着拆成二个?

假设答案是肯定的,也就是说同一个 App 里,同样用途的画面就做了三组 View/Presenter。不对,在 Android 的 Master-Detail 的模板中,Master 的 Activity 是共用的,那岂不变成同一个 View 有二个 Presenter 配对?

这样的设计好像有点累赘,但真的要在这样的设计下,把流程串起来也不是不行。不过,要由 Master-Detail 跳到其他画面的工作,应该三个 Presenter 都相同,是不是要抽离出来,不要在 Presenter 里做?

结果,画面切换要由谁负责的问题又绕回到原点。

当有使用 Service 或 BroadcastReceiver 的需求时,又会引发不同的问题。

没有套用 MVP 之前,都是很直觉地在 Activity 中进行 Service 的使用。Service 大部份是用来进行后端数据处理的作业,这样的 Service 该由 View 来启动吗?不是应该透过 Presenter?

现在前端不适合启动 Service,那该由谁接手?Presenter 吗?

是比 View 合适的选择,但这样又会回到 Presenter 要不要独立于平台之外的问题上。

再者,Service 完成作业之后,如果要以 BroadcastReceiver 的流程来通知外部。BroadcastReceiver 可以放在 Activity 上吗?MVP 传送数据不是都要透过 Presenter?Service 在用来处理数据时,算是后端,不用经过 Presenter 吗?

MVP 设计的下一步

在“MVC 与 MVP 的抉择”一文中提到,把 MVP 中的 View 视为 Sub System,其实并不是突发奇想。而是在导入 MVP 时,用来应对在设计上所碰到的诸多问题的一个环节。

如果要深入的说明整个构思的内容,由于篇幅可能会很大,未来在时间允许之下,会有更多有关这方面的文章来做讨论。

更多深入的文章请参阅 http://www.jianshu.com/u/fea63707e07f

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

推荐阅读更多精彩内容