MVC, MVVM, 與 MVP

iOS開發(fā)工程師份企,大部分時間要和界面打交道,由于蘋果的框架已經(jīng)為我們提供了最基礎(chǔ)的mvc的設(shè)計(jì)模式朵你,許多時候我們只是機(jī)械的添加著一個有一個的view controller, add 一個又一個的subView慎式,那么我們能不能從這些細(xì)節(jié)中脫身出來,到一個更高的層次來總結(jié)我們的iOS前端開發(fā)模式呢俊嗽,本文對常見的MVC設(shè)計(jì)模式及其變種進(jìn)行了總結(jié)。

一. 主動mvc

“主動—MVC”模式铃彰,也是通常意義下的MVC模式



何為主動绍豁?View不是等Controller通知它Model更新了然后才從Model取數(shù)據(jù)并更新顯示,而是自己監(jiān)視Model的更新(如果用觀察者模式)或主動詢問Model是否更新牙捉。前面那種等待Controller通知的方式是下面所介紹的“被動—MVC”的實(shí)現(xiàn)方式竹揍。】

二. 被動mvc(基本等同mvp)

image.png

1)Model 和 View 永遠(yuǎn)不能相互通信鹃共,只能通過 Controller 傳遞鬼佣。

2)Controller 可以直接與 Model 對話(讀寫調(diào)用 Model),Model 通過 Notification 和 KVO 機(jī)制與 Controller 間接通信霜浴。

3)Controller 可以直接與 View 對話晶衷,通過 outlet,直接操作 View,outlet 直接對應(yīng)到 View 中的控件晌纫,View 通過 action 向 Controller 報(bào)告事件的發(fā)生(如用戶 Touch 我了)税迷。Controller 是 View 的直接數(shù)據(jù)源(數(shù)據(jù)很可能是 Controller 從 Model 中取得并經(jīng)過加工了)。Controller 是 View 的代理(delegate)锹漱,以同步 View 與 Controller箭养。

三. 蘋果推薦的mvc

蘋果想要的的mvc和傳統(tǒng)mvc類似,是這樣:


image.png

但是哥牍,由于蘋果的貼心毕泌,每個vc都自帶一個view,所以蘋果的mvc變成這樣:

image.png

那么嗅辣,問題來了撼泛,這樣的模式導(dǎo)致的最重要問題:
model太輕,controller太重澡谭, 最后過于臃腫無法控制愿题,且無法進(jìn)行測試。 MVC 變成 Massive View Controller蛙奖。

四. Controller瘦身

根據(jù)唐巧的博客總結(jié)潘酗,C端瘦身可以抽象成下面幾個方法:

1. 將網(wǎng)絡(luò)請求抽象到單獨(dú)的類中

新手寫代碼,直接就在 Controller 里面用 AFNetworking 發(fā)一個請求雁仲,請求的完數(shù)據(jù)直接就傳遞給 View仔夺。入門一些的同學(xué),知道把這些請求代碼移到另外一個靜態(tài)類里面伯顶。但是我覺得還不夠囚灼,所以我建議將每一個網(wǎng)絡(luò)請求直接封裝成類骆膝。
把每一個網(wǎng)絡(luò)請求封裝成對象其實(shí)是使用了設(shè)計(jì)模式中的 Command 模式祭衩,它有以下好處:

  • 將網(wǎng)絡(luò)請求與具體的第三方庫依賴隔離,方便以后更換底層的網(wǎng)絡(luò)庫阅签。
  • 方便在基類中處理公共邏輯掐暮,例如猿題庫的數(shù)據(jù)版本號信息就統(tǒng)一在基類中處理。
  • 方便在基類中處理緩存邏輯政钟,以及其它一些公共邏輯路克。
  • 方便做對象的持久化。
2.將界面的拼裝抽象到專門的類中

新手寫代碼养交,喜歡在 Controller 中把一個個 UILabel 精算,UIButton,UITextField 往 self.view 上用 addSubView 方法放碎连。我建議大家可以用兩種辦法把這些代碼從 Controller 中剝離灰羽。

方法一:構(gòu)造專門的 UIView 的子類,來負(fù)責(zé)這些控件的拼裝。這是最徹底和優(yōu)雅的方式廉嚼,不過稍微麻煩一些的是玫镐,你需要把這些控件的事件回調(diào)先接管,再都一一暴露回 Controller怠噪。

方法二:用一個靜態(tài)的 Util 類恐似,幫助你做 UIView 的拼裝工作。這種方式稍微做得不太徹底傍念,但是比較簡單矫夷。

對于一些能復(fù)用的 UI 控件,我建議用方法一憋槐。如果項(xiàng)目工程比較復(fù)雜口四,我也建議用方法一。如果項(xiàng)目太緊秦陋,另外相關(guān)項(xiàng)目的代碼量也不多蔓彩,可以嘗試方法二。

3.構(gòu)造 ViewModel

這其實(shí)就是MVVM驳概。具體做法就是將 ViewController 給 View 傳遞數(shù)據(jù)這個過程赤嚼,抽象成構(gòu)造 ViewModel 的過程。
這樣抽象之后顺又,View 只接受 ViewModel更卒,而 Controller 只需要傳遞 ViewModel 這么一行代碼。而另外構(gòu)造 ViewModel 的過程稚照,我們就可以移動到另外的類中了蹂空。

4.專門構(gòu)造存儲類

剛剛說到 ViewModel 的構(gòu)造可以抽獎到一個 Service 層。與此相應(yīng)的果录,數(shù)據(jù)的存儲也應(yīng)該由專門的對象來做上枕。

數(shù)據(jù)存取放在專門的類中,就可以針對存取做額外的事情了弱恒。比如:

  • 對一些熱點(diǎn)數(shù)據(jù)增加緩存
  • 處理數(shù)據(jù)遷移相關(guān)的邏輯
  • 如果要做得更細(xì)辨萍,可以把存儲引擎再抽象出一層。這樣你就可以方便地切換存儲的底層返弹,例如從 sqlite 切換到 key-value 的存儲引擎等锈玉。

五. MVVM

MVVM其實(shí)是MVVMC, 其實(shí)就是構(gòu)造了一個充血數(shù)據(jù)模型,并將充血的部分從Controller中劃到了ViewModel中义起,其模型如下:
View <-> C <-> ViewModel <->Model

比如一個最簡單的Name類拉背,從服務(wù)端拿到兩個屬性firstName與lastName,但是界面上需要展示的是fullName默终,這個時候可以構(gòu)造一個VM類椅棺,可以通過Name類的firstName yu lastName來組裝fullName抡诞。 當(dāng)然這是最簡單的一個例子,但基本就是類似的意思土陪。

MVVM 在使用當(dāng)中昼汗,通常還會利用雙向綁定技術(shù),使得 Model 變化時鬼雀,ViewModel 會自動更新顷窒,而 ViewModel 變化時,View 也會自動變化源哩。所以鞋吉,MVVM 模式有些時候又被稱作:model-view-binder 模式。
具體在 iOS 中励烦,可以使用 KVO 或 Notification 技術(shù)達(dá)到這種效果谓着。或者使用ReactiveCocoa坛掠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赊锚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子屉栓,更是在濱河造成了極大的恐慌舷蒲,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件友多,死亡現(xiàn)場離奇詭異牲平,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)域滥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門纵柿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人启绰,你說我怎么就攤上這事昂儒。” “怎么了酬土?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵荆忍,是天一觀的道長。 經(jīng)常有香客問我撤缴,道長,這世上最難降的妖魔是什么叽唱? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任屈呕,我火速辦了婚禮,結(jié)果婚禮上棺亭,老公的妹妹穿的比我還像新娘虎眨。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布嗽桩。 她就那樣靜靜地躺著岳守,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碌冶。 梳的紋絲不亂的頭發(fā)上湿痢,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音扑庞,去河邊找鬼譬重。 笑死,一個胖子當(dāng)著我的面吹牛罐氨,可吹牛的內(nèi)容都是我干的臀规。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼栅隐,長吁一口氣:“原來是場噩夢啊……” “哼塔嬉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起租悄,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤邑遏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恰矩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體记盒,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年外傅,在試婚紗的時候發(fā)現(xiàn)自己被綠了纪吮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡萎胰,死狀恐怖碾盟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情技竟,我是刑警寧澤冰肴,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站榔组,受9級特大地震影響熙尉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搓扯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一检痰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锨推,春花似錦铅歼、人聲如沸公壤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厦幅。三九已至,卻和暖如春慨飘,著一層夾襖步出監(jiān)牢的瞬間确憨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工套媚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缚态,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓堤瘤,卻偏偏與公主長得像玫芦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子本辐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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