MVC、MVVM的理解

最近看到身边的小伙伴,写代码的风格着实不堪入目,没有基本的设计模式概念。
回过头问自己,真的对主流的设计模式都有很透彻的了解吗?仔细想想,自己最了解的就是MVC设计模式(如果你也有同感,那么请认真阅读下文,因为你可能真的不是特别了解MVC)、我对MVVM是在2015年学习Python的时候开始用到的,而MVP则是在打游戏的过程中了解的(开玩笑啦)..

一. MVC

我们先来了解一下什么是MVC
MVC:分别所指ModelViewControllerMVC为标准的设计模式,是官方推荐的权威的规范模式。

  • 视图(View):用户交互界面。
  • 控制器(Controller):调节Modle和View的交互。
  • 模型(Model):业务逻辑模型(并非数据模型)

注意:这里大家容易误解Model,可能通常大家模型对象感觉非常的简单,就只是做数据模型,使Model的量级特别的轻,这样就加重了Controller对业务逻辑的处理,加重了Controller的量级
而根据Apple的文档,model应包括数据和操作数据的业务逻辑。所以在我们在写Model部分的时候一定要注意,不是每个Controller只能对应一个Model,减少在Controller的业务逻辑,加重Model的量级。

1497256166205687.png

如图所示,这是一个基本的MVC模式示意图。在MVC1中,Controller和其他部分之间的通信都是双向的。而Viewmodel之间没有任何通信关系

但是很多小伙伴可能都觉得这是个啥?才特么不是这样的。
如果大家有这样的感觉,那么你多少是有一些写代码的经验的。
举个小例子:

大家在开发的过程中,经常会自定义Cell,通过网络请求的数据,转换为数据模型,将数据模型传递给Cell,Cell在根据模型的内容对自身的控件内容做填充。
就这样一个简单的例子,我们就发现,Cell需要引用并调用Model,那么上图就不符合我们对MVC的理解。

上图为典型的MVC的理念,然而,MVC架构理念已经不能满足于当下的iOS开发。

尽管从技术上看View 和 Controller 是相互独立的,但事实上它们几乎总是结对出现,一个View只能与一个 Controller 进行匹配,反之亦然。但是在实际开发中,我们需要采取更为灵活的方式。
于是现在较为主流的"MVVM",应运而生了。

二. MVVM

我们先来了解一下什么是MVVM
MVVM:分别所指ModelView | ControllerViewModel
在MVVM中,view 和 view controller结合在一起,我们把它们看做一个部分。

  • 视图(View | Controller):调用ViewModel的方法并响应变化。
  • 视图模型(ViewModel):业务逻辑。
  • 模型(Model):数据模型
    在MVVM 中,view 和 view controller正式联系在一起,我们把它们视为一个组件


    1497256097808253.png

如图所示,这是一个基本的MVVM模式示意图。从图中我们可以得知
*ViewModelModel之间的通信是双向的。
*ViewViewController都不能直接引用Model,而是引用视图模型ViewModel

  • ViewModel用来放置用户交互验证逻辑;视图显示逻辑;发起网络请求和其他代码。

注意: 使用MVVM会一定程度的增加程序的代码量,但总体上减少了代码的复杂性,并能很好的减轻Controller的量级。View引用ViewModel,但反过来不行,任何视图本身的引用都不应该放在viewModel中。ViewController尽量不涉及业务逻辑,让ViewModel去做这些事情。ViewModel应避免过于臃肿,否则重蹈Controller的“覆辙”,变得更难以维护。

三. 总结

优点:MVC

  • 易懂: 简单易懂,我想用这四个字来形容MVC在合适不过了。
  • 层次分明: 共三个部分,各自完成各自的内容,在有Controller将大家协调在一起。

弊端:MVC

  • 量级重 : ViewController处理过多的业务逻辑如协调模型和视图之间的所有交互,导致量级重,维护成本很高。
  • 过轻的Model对象:在实践中往往大家都把Model的量级设计的非常轻,总容易当做数据模型来对待。

至于很开发者所说的无法添加的网络逻辑,我个人认为完全可以设计添加到Model中。但要注意根据需求来选择“同步或异步”。

优点: MVVM

  • 低耦合: View可以独立于Model变化和修改,一个ViewModel可以绑定到不同的View 上。
  • 可重用性: 可以把一些视图逻辑放在一个ViewModel里面,让很多View重用这段视图逻辑。

弊端:MVVM

  • 数据绑定后使得Bug很难被调试。
  • 数据绑定和数据转化需要花费更多的内存成本。
个人见解

我们开发者不应该过分的追求选择哪一种模式来开发,设计模式并没有好坏之分,每个模式都有各自的优缺点,需要根据我们项目架构,来选择最何时的开发设计模式。

PS:建议大家在MVC模式下,对Model模块进行设计,不是每一个Controller只能对应一个Model,要加重对Model的量级,Controller的臃肿是可以很好的优化解决的。

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

推荐阅读更多精彩内容