我的MVVM之路

前言

了解前端的演化之路需要知道的两件事

  1. 架构不是一天实现而是演化出来的 </br>
  2. 架构的出现是为了解决一个或者一类问题的
    </br>

UI包含什么?

在讨论UI框架之前,我们先来了解一个页面可能有的内容,一个UI页面正常包含的内容有

  1. 绑定事件,即响应用户的操作,常见的事件有点击,长按,滚动
  2. 向业务获得业务模型
  3. 展现模型,包括设置呈现内容,调整显示图层等
  4. 动画
  5. 显示

正常他们的流程关系�如下图:


temp.jpg

正常来说,一个页面的大部分内容都应该是源自业务的,只有少数部分是用户操作引起的页面内容改动与业务无关(如滚动)
</br>

蛮荒时代

在互联网刚出现的时代,web端的html,js是全部写在一起的,同一个html既处理UI又处理业务,这种做法在那个刚起步的时代并没有什么问题,但随着业务的发展,逻辑日趋复杂,这种做法的弊端开始出现,整个业务逻辑变得复杂而难以维护
</br>

MVC时代 (web端主流框架,大部分移动端系统的默认架构)

MVC的到来,就是为了解决逻辑混杂的问题,从而将页面简单的进行功能划分,M负责处理业务,V负责显示,C负责设置V显示内容,响应V事件并调用M处理,MVC最明显的优点是,M的开发完全独立,不再需要考虑页面如何显示,而是直接的面相业务逻辑,V的开发也不需要考虑业务需要显示什么模型,而是直接面对显示结果 </br>
这是一个基础的MVC结构显示

MVC.jpg

MVC只是对原有页面的简单拆分,所以,还是存在部分问题的
在这个简单的MVC例子,短短的40多行代码中,混合了事件绑定,业务,UI显示操作,动画,一旦页面逻辑稍微复杂,C就会严重膨胀,影响编写与阅读

MVC_Comment.jpg

</br>

MVP时代

为了解决MVC遇到的问题,MVP(Model - View - Presenter)随之出现,MVP中的V是大V,顺序不是MVP,严格来说,MVP应该叫(Model - Presenter - Controller - View),他将页面的业务逻辑从C中拆分出来,放入P中,从而达到独立页面逻辑,最终达到页面显示/页面逻辑都可以单独测试的效果
经过拆分后,P在编写的时候已不需要考虑V具体怎么实现,只需要关心响应什么事件,向V提供什么模型
而VC也只需要关心模型怎么展现,在什么位置响应用户的操作
还是同样的例子,但是把业务拆分到Presenter

MVP_Activity_Comment.jpg
MVP_Presenter.jpg

但MVP也不是没有缺点的,试想一下这种情况,我们现在需要显示一个列表,我们使用一个为Activity增加了一个Adapter显示这个列表

MVP_Weakness_Adapter.jpg

这时候,产品说我们需要增加一个昵称,这个昵称从另一个服务获得,我们来看看这时候我们需要改动什么,我们需要在顶层View(也就是Activity)上增加一个回调,

MVP_Weakness_Add_Field_Activity.jpg

接着,我们需要在Adapter上增加一个方法,刷新全部

MVP_Weakness_Add_Field_Adapter.jpg

这时候我们思考下,

  1. 我们只是要在列表的单项里面增加一个显示内容,但我们却需要在他的父层级改动
    2.我们改动的是item,却不得不刷新整个列表

对MVP的Presenter来说,View是单一的,意味着模型只能够传递到最顶层的View,再由顶层View逐级下发,一旦传递的模型增加,传递的层级加深,这部分就内容就非常容易膨胀,那如果底层的View能直接从P那边得到数据呢?MVVM的出现就是为了解决这么一个问题

</br>

MVVM时代

MVVM是一个基于模型绑定的框架。通过在V上增加对VM的监听,使P对VM的修改直接反应到V上,从而避免P的每一次修改都需要从主View逐级传递到子View上。
MVVM的V跟MVP一样也是大V,包含Controller和View,网上有些Demo把业务也集合进VM,但这里为了逻辑清晰,并且方便测试,我们将VM也业务独立出来,也就是把P独立出来,所以,整个框架应该是 M(P)VM(C)V
我们在Activity初始化的时候构造一个ViewModel,Present则由ViewModel来构造(为了使View对业务透明),ViewModel向View提供显示需要的业务模型。而对于底层的View来说,只需要传入一个ViewModel,接下来他的所有显示就与上层View无关了。ViewModel的任何改动,不再需要顶层View介入,就能传递到底层了

在Activity中构造ViewModel
将ViewModel传入Adapter
Adapter自行对ViewModel实现监听

经过MVVM改造后,顶层View只有在构造的时候需要传入ViewModel,其他任何时候,底层View都能直接通过ViewModel获得自己要显示的内容,每一个底层View都是最小单元的MVC,具体底层View怎么显示已经与他的上层没有任何关系,ViewModel增加Field也不再需要通过顶层View传递进来,下层View能直接通过ViewModel获得

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

推荐阅读更多精彩内容