最近看到身邊的小伙伴痕支,寫代碼的風(fēng)格著實不堪入目,沒有基本的設(shè)計模式概念蛮原。
回過頭問自己卧须,真的對主流的設(shè)計模式都有很透徹的了解嗎?仔細(xì)想想儒陨,自己最了解的就是MVC設(shè)計模式(如果你也有同感花嘶,那么請認(rèn)真閱讀下文,因為你可能真的不是特別了解MVC)蹦漠、我對MVVM是在2015年學(xué)習(xí)Python的時候開始用到的椭员,而MVP則是在打游戲的過程中了解的(開玩笑啦)..
一. MVC
我們先來了解一下什么是MVC
。
MVC
:分別所指Model
笛园、View
、Controller
。 MVC
為標(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
的量級人灼。
如圖所示段磨,這是一個基本的
MVC模式
示意圖。在MVC1中,Controller
和其他部分之間的通信都是雙向的。而View
和model
之間沒有任何通信關(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模式示意圖觅闽。從圖中我們可以得知
*ViewModel
和Model
之間的通信是雙向的。
*View
和ViewController
都不能直接引用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)化解決的。