IOS MVC鹦赎、MVP、MVVM误堡、VIPER架構(gòu)詳解

何為架構(gòu)古话?

  • 軟件開發(fā)中的設(shè)計方案。
  • 類與類之間的關(guān)系锁施、模塊與模塊之間額關(guān)系陪踩、客戶端與服務(wù)端的關(guān)系。

經(jīng)常聽到的架構(gòu)名詞沾谜?

  • MVC膊毁、MVP、MVVM基跑、VIPER婚温、CDD。
  • 三層架構(gòu)媳否、四層架構(gòu)栅螟。

MVC

Model-View-Controller

  • Model:
    模型對象封裝了應(yīng)用程序的數(shù)據(jù),并定義操控和處理該數(shù)據(jù)的邏輯和運算篱竭。例如力图,模型對象可能是表示商品數(shù)據(jù) list。用戶在視圖層中所進(jìn)行的創(chuàng)建或修改數(shù)據(jù)的操作掺逼,通過控制器對象傳達(dá)出去吃媒,最終會創(chuàng)建或更新模型對象。模型對象更改時(例如通過網(wǎng)絡(luò)連接接收到新數(shù)據(jù))吕喘,它通知控制器對象赘那,控制器對象更新相應(yīng)的視圖對象。
  • View:
    視圖對象是應(yīng)用程序中用戶可以看見的對象氯质。視圖對象知道如何將自己繪制出來募舟,可能對用戶的操作作出響應(yīng)。視圖對象的主要目的就是顯示來自應(yīng)用程序模型對象的數(shù)據(jù)闻察,并使該數(shù)據(jù)可被編輯拱礁。盡管如此,在 MVC 應(yīng)用程序中辕漂,視圖對象通常與模型對象分離呢灶。
    在iOS應(yīng)用程序開發(fā)中,所有的控件钉嘹、窗口等都繼承自 UIView填抬,對應(yīng) MVC 中的 V。UIView 及其子類主要負(fù)責(zé) UI 的實現(xiàn)隧期,而 UIView 所產(chǎn)生的事件都可以采用委托的方式飒责,交給 UIViewController 實現(xiàn)。
  • Controller:
    在應(yīng)用程序的一個或多個視圖對象和一個或多個模型對象之間仆潮,控制器對象充當(dāng)媒介宏蛉。控制器對象因此是同步管道程序性置,通過它拾并,視圖對象了解模型對象的更改,反之亦然鹏浅⌒嵋澹控制器對象還可以為應(yīng)用程序執(zhí)行設(shè)置和協(xié)調(diào)任務(wù),并管理其他對象的生命周期隐砸。
    控制器對象解釋在視圖對象中進(jìn)行的用戶操作之碗,并將新的或更改過的數(shù)據(jù)傳達(dá)給模型對象。模型對象更改時季希,一個控制器對象會將新的模型數(shù)據(jù)傳達(dá)給視圖對象褪那,以便視圖對象可以顯示它。
MVC
  • 優(yōu)點:View式塌、Model可以重復(fù)利用博敬。
  • 缺點:Controller的代碼過于臃腫。

MVP

Model View Presenter(模型 視圖 協(xié)調(diào)器)

  • Model:
    數(shù)據(jù)對象峰尝,包含網(wǎng)絡(luò)請求偏窝,以及數(shù)據(jù) SQLite 的 CRUD(增加(Create)、讀取(Retrieve)武学、更新(Update)和刪除(Delete)) 操作(比如 iOS 平臺祭往,一般以 FMDB 框架直接操作 sql,或者用 CoreData) 劳淆。一般可以將數(shù)據(jù)對象是否需要緩存設(shè)計成一個字段 isCache链沼,或者針對整個項目設(shè)計一個開存儲關(guān),決定整個項目是否需要數(shù)據(jù)緩存沛鸵。我們常見的新聞類 App括勺,在離線的時候看到的數(shù)據(jù),都是做了緩存處理的曲掰。比如一些金融類的 App疾捍,實時性比較高,是不做緩存的栏妖。
  • View:
    就是 View 的一些封裝乱豆、重用。在一款精心設(shè)計過的 App 里面吊趾,應(yīng)該有很多 View 是可以封裝重用的宛裕。比如一些自己的 TableViewCell瑟啃,自己設(shè)計的 Button,一些 View(包含一些子 View揩尸,UI 精心設(shè)計過蛹屿,在項目里多處出現(xiàn)的)等等。
  • Presenter:
    只是 Model 層和 View/ViewController層的一個橋梁岩榆。Presenter 層就不至于太臃腫错负,容易看懂。一些大的 App勇边,或因為上線時間比較久了犹撒,經(jīng)歷過眾多程序員的修補(bǔ),或因前期并未做好架構(gòu)粒褒,以至于打開一個類识颊,幾千行的代碼,看著自己都暈怀浆。


    MVP
  • 優(yōu)點:
    模型與視圖完全分離谊囚,我們可以修改視圖而不影響模型
    可以更高效地使用模型,因為所有的交互都發(fā)生在一個地方——Presenter內(nèi)部
    我們可以將一個Presener用于多個視圖执赡,而不需要改變Presenter的邏輯镰踏。這個特性非常的有用,因為視圖的變化總是比模型的變化頻繁沙合。
    如果我們把邏輯放在Presenter中奠伪,那么我們就可以脫離用戶接口來測試這些邏輯(單元測試)
  • 缺點:
    由于對視圖的渲染放在了Presenter中,所以視圖和Persenter的交互會過于頻繁首懈。
    還有一點你需要明白绊率,如果Presenter過多地渲染了視圖,往往會使得它與特定的視圖的聯(lián)系過于緊密究履。一旦視圖需要變更滤否,那么 Presenter也需要變更了。比如說最仑,原本用來呈現(xiàn)Html的Presenter現(xiàn)在也需要用于呈現(xiàn)Pdf了藐俺,那么視圖很有可能也需要變更。

MVVM

View泥彤、View Model欲芹、Model這三部分之間的相互解耦。

  • Model:
    與業(yè)務(wù)和驗證邏輯有關(guān)的域模型吟吝,都可以認(rèn)為是MVVM中的Model菱父。比如:業(yè)務(wù)對象,數(shù)據(jù)傳輸對象(DTOs),實體浙宜,代理對象等等都可以認(rèn)為是Model官辽。
    這里的Model與MVC中的Model一樣。
  • View:
    View負(fù)責(zé)定義頁面結(jié)構(gòu)粟瞬,布局用戶在屏幕上看到的界面野崇。在iOS開發(fā)中,View一般是程序中的一個頁面亩钟。一個View也可以是父View的一部分。
    每個View都有自己的View Model鳖轰,或者它從父View中繼承了View Model清酥。View通常是通過通過View Model的綁定,或者調(diào)用View Model中的方法來獲取數(shù)據(jù)蕴侣。在運行的時候焰轻,UI控件要響應(yīng)View Model拋出通知事件,來更新UI昆雀。
    為了響應(yīng)UI上的交互辱志,需要在View Model中實現(xiàn)相應(yīng)的代碼。比如一個按鈕被點擊狞膘。需要將這個按鈕點擊事件綁定到View Model中去揩懒。然后在View Model中寫代碼處理用戶的交互。
    在iOS開發(fā)中View和ViewController都是屬于View這部分挽封。
  • View Model:
    View Model扮演著View和Model的中介角色已球,它負(fù)責(zé)處理視圖邏輯和數(shù)據(jù)轉(zhuǎn)化。一般來說View Model通過調(diào)用Model的方法來和Model進(jìn)行交互辅愿。View Model隨后將從Model中獲取的數(shù)據(jù)以一種view容易使用的格式提供給View智亮。View Model負(fù)責(zé)UI交互的響應(yīng)代碼實現(xiàn)。例如:當(dāng)用戶點擊了一個按鈕在UI中点待,這個動作會使得View Model中相應(yīng)代碼被執(zhí)行阔蛉。View Model也負(fù)責(zé)控制視圖的顯示邏輯,比如修改UI指示操作正在進(jìn)行癞埠。
MVVM
  • 優(yōu)點:
    方便測試 便于代碼的移植状原。
    兼容MVC。
  • 缺點:
    類會增多燕差,ViewModel會越來越龐大遭笋,調(diào)用復(fù)雜度增加。

VIPER

  • View(視圖)
    提供完整的視圖徒探,負(fù)責(zé)視圖的組合瓦呼、布局、更新
    向Presenter提供更新視圖的接口
    將View相關(guān)的事件發(fā)送給Presenter
  • Presenter(展示器)
    接收并處理來自View的事件
    向Interactor請求調(diào)用業(yè)務(wù)邏輯
    向Interactor提供View中的數(shù)據(jù)
    接收并處理來自Interactor的數(shù)據(jù)回調(diào)事件
    通知View進(jìn)行更新操作
    通過Router跳轉(zhuǎn)到其他View
  • Router(路由)
    提供View之間的跳轉(zhuǎn)功能,減少了模塊間的耦合
    初始化VIPER的各個模塊
  • Interactor(交互器)
    維護(hù)主要的業(yè)務(wù)邏輯功能央串,向Presenter提供現(xiàn)有的業(yè)務(wù)用例
    維護(hù)磨澡、獲取、更新Entity
    當(dāng)有業(yè)務(wù)相關(guān)的事件發(fā)生時质和,處理事件稳摄,并通知Presenter
  • Entity(實體)
    和Model一樣的數(shù)據(jù)模型
VIPER
  • 優(yōu)點:
    可測試性好踢关。UI測試和業(yè)務(wù)邏輯測試可以各自單獨進(jìn)行英岭。
    易于迭代乖仇。各部分遵循單一職責(zé)伐脖,可以很明確地知道新的代碼應(yīng)該放在哪里傍药。
    隔離程度高昧谊,耦合程度低尝偎。一個模塊的代碼不容易影響到另一個模塊重归。
    易于團(tuán)隊合作国夜。各部分分工明確减噪,團(tuán)隊合作時易于統(tǒng)一代碼風(fēng)格,可以快速接手別人的代碼车吹。
  • 缺點:
    一個模塊內(nèi)的類數(shù)量增大筹裕,代碼量增大,在層與層之間需要花更多時間設(shè)計接口窄驹。
    模塊的初始化較為復(fù)雜朝卒,打開一個新的界面需要生成View、Presenter馒吴、Interactor扎运,并且設(shè)置互相之間的依賴關(guān)系。而iOS中缺少這種設(shè)置復(fù)雜初始化的原生方式饮戳。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載豪治,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末扯罐,一起剝皮案震驚了整個濱河市负拟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歹河,老刑警劉巖掩浙,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異秸歧,居然都是意外死亡厨姚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門键菱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谬墙,“玉大人,你說我怎么就攤上這事∈锰В” “怎么了部默?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長造虎。 經(jīng)常有香客問我傅蹂,道長,這世上最難降的妖魔是什么算凿? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任份蝴,我火速辦了婚禮,結(jié)果婚禮上氓轰,老公的妹妹穿的比我還像新娘搞乏。我一直安慰自己,他們只是感情好戒努,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著镐躲,像睡著了一般储玫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萤皂,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天撒穷,我揣著相機(jī)與錄音,去河邊找鬼裆熙。 笑死端礼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的入录。 我是一名探鬼主播蛤奥,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼僚稿!你這毒婦竟也來了凡桥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蚀同,失蹤者是張志新(化名)和其女友劉穎缅刽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蠢络,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡衰猛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了刹孔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啡省。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冕杠,到底是詐尸還是另有隱情微姊,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布分预,位于F島的核電站兢交,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏笼痹。R本人自食惡果不足惜配喳,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凳干。 院中可真熱鬧晴裹,春花似錦、人聲如沸救赐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽经磅。三九已至泌绣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間预厌,已是汗流浹背阿迈。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留轧叽,地道東北人苗沧。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像炭晒,于是被迫代替她去往敵國和親待逞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

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

  • 想討論下EOS和BTM比原网严,因為這里有個有趣的對比剛好符合這個議題飒焦。而我“剛好”也持有些這兩種token,有興趣寫...
    李白起不來閱讀 784評論 0 2
  • 據(jù)科學(xué)研究證明:現(xiàn)代人如果長期單一地食用精米白面可能會導(dǎo)致人體維生素B1的缺乏休雌,繼而嚴(yán)重危害人體健康。這就要求我們...
    惠顧星辰閱讀 749評論 4 27
  • 同生在水池肝断,也有凌云志杈曲。 金鱗化龍去驰凛,風(fēng)云際會時。 鴻鵠高飛過担扑,曾想生雙翅恰响。 鼓氣與牛比,身小應(yīng)自知涌献。 溫水煮其身...
    且行且進(jìn)且珍惜閱讀 337評論 3 6
  • 在一個完全陌生的地方 付出半生心血 咬牙買幾間臥房 不為城市的高大上 只為避開那些無端的糾纏 在鬧市之中結(jié)束流浪 ...
    瑜伽散人閱讀 135評論 4 7