MVC呼畸、MVVM的理解

最近看到身邊的小伙伴痕支,寫代碼的風(fēng)格著實不堪入目,沒有基本的設(shè)計模式概念蛮原。
回過頭問自己卧须,真的對主流的設(shè)計模式都有很透徹的了解嗎?仔細(xì)想想儒陨,自己最了解的就是MVC設(shè)計模式(如果你也有同感花嘶,那么請認(rèn)真閱讀下文,因為你可能真的不是特別了解MVC)蹦漠、我對MVVM是在2015年學(xué)習(xí)Python的時候開始用到的椭员,而MVP則是在打游戲的過程中了解的(開玩笑啦)..

一. MVC

我們先來了解一下什么是MVC
MVC:分別所指Model笛园、ViewControllerMVC為標(biāo)準(zhǔn)的設(shè)計模式,是官方推薦的權(quán)威的規(guī)范模式虱肄。

  • 視圖(View):用戶交互界面。
  • 控制器(Controller):調(diào)節(jié)Modle和View的交互。
  • 模型(Model):業(yè)務(wù)邏輯模型(并非數(shù)據(jù)模型)

注意:這里大家容易誤解Model,可能通常大家模型對象感覺非常的簡單绘面,就只是做數(shù)據(jù)模型瘦馍,使Model的量級特別的輕箩祥,這樣就加重了Controller對業(yè)務(wù)邏輯的處理,加重了Controller的量級
而根據(jù)Apple的文檔柑营,model應(yīng)包括數(shù)據(jù)和操作數(shù)據(jù)的業(yè)務(wù)邏輯惋嚎。所以在我們在寫Model部分的時候一定要注意绞旅,不是每個Controller只能對應(yīng)一個Model,減少在Controller的業(yè)務(wù)邏輯,加重Model的量級人灼。

1497256166205687.png

如圖所示段磨,這是一個基本的MVC模式示意圖。在MVC1中,Controller和其他部分之間的通信都是雙向的。而Viewmodel之間沒有任何通信關(guān)系

但是很多小伙伴可能都覺得這是個啥?才特么不是這樣的。
如果大家有這樣的感覺,那么你多少是有一些寫代碼的經(jīng)驗的。
舉個小例子:

大家在開發(fā)的過程中,經(jīng)常會自定義Cell石挂,通過網(wǎng)絡(luò)請求的數(shù)據(jù),轉(zhuǎn)換為數(shù)據(jù)模型,將數(shù)據(jù)模型傳遞給Cell,Cell在根據(jù)模型的內(nèi)容對自身的控件內(nèi)容做填充。
就這樣一個簡單的例子削祈,我們就發(fā)現(xiàn),Cell需要引用并調(diào)用Model碳却,那么上圖就不符合我們對MVC的理解关噪。

上圖為典型的MVC的理念泽艘,然而,MVC架構(gòu)理念已經(jīng)不能滿足于當(dāng)下的iOS開發(fā)来农。

盡管從技術(shù)上看View 和 Controller 是相互獨立的,但事實上它們幾乎總是結(jié)對出現(xiàn)饵较,一個View只能與一個 Controller 進(jìn)行匹配逆粹,反之亦然。但是在實際開發(fā)中侈百,我們需要采取更為靈活的方式锭魔。
于是現(xiàn)在較為主流的"MVVM"织咧,應(yīng)運而生了手趣。

二. MVVM

我們先來了解一下什么是MVVM
MVVM:分別所指Model淀散、View | Controller郭膛、ViewModel士袄。
在MVVM中,view 和 view controller結(jié)合在一起般甲,我們把它們看做一個部分肋乍。

  • 視圖(View | Controller):調(diào)用ViewModel的方法并響應(yīng)變化。
  • 視圖模型(ViewModel):業(yè)務(wù)邏輯敷存。
  • 模型(Model):數(shù)據(jù)模型
    在MVVM 中墓造,view 和 view controller正式聯(lián)系在一起,我們把它們視為一個組件


    1497256097808253.png

如圖所示锚烦,這是一個基本的MVVM模式示意圖觅闽。從圖中我們可以得知
*ViewModelModel之間的通信是雙向的。
*ViewViewController都不能直接引用Model涮俄,而是引用視圖模型ViewModel

  • ViewModel用來放置用戶交互驗證邏輯蛉拙;視圖顯示邏輯;發(fā)起網(wǎng)絡(luò)請求和其他代碼彻亲。

注意: 使用MVVM會一定程度的增加程序的代碼量孕锄,但總體上減少了代碼的復(fù)雜性,并能很好的減輕Controller的量級苞尝。View引用ViewModel畸肆,但反過來不行,任何視圖本身的引用都不應(yīng)該放在viewModel中。ViewController盡量不涉及業(yè)務(wù)邏輯宙址,讓ViewModel去做這些事情轴脐。ViewModel應(yīng)避免過于臃腫,否則重蹈Controller的“覆轍”曼氛,變得更難以維護(hù)豁辉。

三. 總結(jié)

優(yōu)點:MVC

  • 易懂: 簡單易懂,我想用這四個字來形容MVC在合適不過了舀患。
  • 層次分明: 共三個部分徽级,各自完成各自的內(nèi)容,在有Controller將大家協(xié)調(diào)在一起聊浅。

弊端:MVC

  • 量級重 : ViewController處理過多的業(yè)務(wù)邏輯如協(xié)調(diào)模型和視圖之間的所有交互餐抢,導(dǎo)致量級重,維護(hù)成本很高低匙。
  • 過輕的Model對象:在實踐中往往大家都把Model的量級設(shè)計的非常輕旷痕,總?cè)菀桩?dāng)做數(shù)據(jù)模型來對待。

至于很開發(fā)者所說的無法添加的網(wǎng)絡(luò)邏輯顽冶,我個人認(rèn)為完全可以設(shè)計添加到Model中欺抗。但要注意根據(jù)需求來選擇“同步或異步”。

優(yōu)點: MVVM

  • 低耦合: View可以獨立于Model變化和修改强重,一個ViewModel可以綁定到不同的View 上绞呈。
  • 可重用性: 可以把一些視圖邏輯放在一個ViewModel里面贸人,讓很多View重用這段視圖邏輯。

弊端:MVVM

  • 數(shù)據(jù)綁定后使得Bug很難被調(diào)試佃声。
  • 數(shù)據(jù)綁定和數(shù)據(jù)轉(zhuǎn)化需要花費更多的內(nèi)存成本艺智。
個人見解

我們開發(fā)者不應(yīng)該過分的追求選擇哪一種模式來開發(fā),設(shè)計模式并沒有好壞之分圾亏,每個模式都有各自的優(yōu)缺點十拣,需要根據(jù)我們項目架構(gòu),來選擇最何時的開發(fā)設(shè)計模式志鹃。

PS:建議大家在MVC模式下夭问,對Model模塊進(jìn)行設(shè)計,不是每一個Controller只能對應(yīng)一個Model弄跌,要加重對Model的量級甲喝,Controller的臃腫是可以很好的優(yōu)化解決的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铛只,一起剝皮案震驚了整個濱河市埠胖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淳玩,老刑警劉巖直撤,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜕着,居然都是意外死亡谋竖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門承匣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蓖乘,“玉大人,你說我怎么就攤上這事韧骗〖问悖” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵袍暴,是天一觀的道長些侍。 經(jīng)常有香客問我,道長政模,這世上最難降的妖魔是什么岗宣? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮淋样,結(jié)果婚禮上耗式,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好纽什,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布措嵌。 她就那樣靜靜地躺著躲叼,像睡著了一般芦缰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枫慷,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天让蕾,我揣著相機與錄音,去河邊找鬼或听。 笑死探孝,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的誉裆。 我是一名探鬼主播顿颅,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼足丢!你這毒婦竟也來了粱腻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤斩跌,失蹤者是張志新(化名)和其女友劉穎绍些,沒想到半個月后耀鸦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氮帐,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡奄容,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年舟铜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片归斤。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡迫横,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤徘公,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站缩抡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏娩嚼。R本人自食惡果不足惜蘑险,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岳悟。 院中可真熱鬧佃迄,春花似錦泼差、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至普碎,卻和暖如春吼肥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背随常。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工潜沦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绪氛。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像涝影,于是被迫代替她去往敵國和親枣察。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容