前言
一千個(gè)人看待MVVM模式圈暗,可能會有一千種看法,筆者在實(shí)踐中提供自己的理解缘挽,供參考瞄崇。
簡介
容筆者做實(shí)踐講解時(shí),先介紹下MVC壕曼、MVP苏研、MVVM三種模式
MVC
蘋果官方提供的MVC版本和后來演變的MVP很像,C層承擔(dān)了所有邏輯(包括數(shù)據(jù)處理和UI響應(yīng))的交互
- 優(yōu)點(diǎn):View腮郊、Model可以重復(fù)利用摹蘑,可以獨(dú)立使用缺點(diǎn):
- Controller的代碼過于臃腫
為解決 Controller的代碼過于臃腫
的問題,產(chǎn)生了MVC的變種:
- 優(yōu)點(diǎn):對Controller進(jìn)行瘦身轧飞,將View內(nèi)部的細(xì)節(jié)封裝衅鹿,外界不感知View內(nèi)部的具體實(shí)現(xiàn)
- 缺點(diǎn):View依賴于Model
MVP
MVP和蘋果官方的MVC比較相似撒踪,不同點(diǎn)在于將原本寫在C層的邏輯代碼,用Present層進(jìn)行了沉淀大渤。
- 優(yōu)點(diǎn):
- 便于測試。Presenter對View是通過接口進(jìn)行,在對Presenter進(jìn)行不依賴UI環(huán)境的單元測試的時(shí)候继找“橥可以通過Mock一個(gè)View對象,這個(gè)對象只需要實(shí)現(xiàn)了View的接口即可烫幕。單元測試的時(shí)候就可以完整的測試Presenter業(yè)務(wù)邏輯的正確性砸脊。
- View可以進(jìn)行組件化。在MVP當(dāng)中纬霞,View不依賴Model凌埂,做到對業(yè)務(wù)邏輯完全無知。只需要提供一系列接口提供給上層操作诗芜。
- 缺點(diǎn):
- Presenter中除了業(yè)務(wù)邏輯以外瞳抓,還有大量的View->Model,Model->View的手動同步邏輯伏恐,造成Presenter比較笨重孩哑,維護(hù)起來會比較困難。
MVVM
MVVM分為三個(gè)部分:Model(數(shù)據(jù))翠桦、View(界面)横蜒、ViewModel(數(shù)據(jù)綁定層)。在MVP的基礎(chǔ)上销凑,采用雙向綁定(data-binding)的方式進(jìn)行交互:
MVVM的實(shí)踐
從上文對MVVM的描述丛晌,我們實(shí)踐過程中還是發(fā)現(xiàn)了一些問題:
- VM通過通知的方式與M層交互,但在實(shí)際場景中斗幼,會增加很多不明確性澎蛛。以TableView舉例,TableView需要通過vm層reloadData時(shí)蜕窿,不可能VM層用通知的方式來更新Model數(shù)據(jù)谋逻。
- M層的設(shè)計(jì)存在爭議,業(yè)界也有大M和小M之爭桐经,不同的業(yè)務(wù)場景可能會采用不同的M層設(shè)計(jì)
- 大M:包含數(shù)據(jù)模型毁兆、數(shù)據(jù)獲取和數(shù)據(jù)操作的ModelService
- 小M:無邏輯的數(shù)據(jù)模型
筆者這邊做了以下取舍:
- 定義頁面級別的上下文context,其包含頁面必要參數(shù)阴挣、VC實(shí)例等等气堕,承擔(dān)MVVM的數(shù)據(jù)透傳
- 容器承擔(dān)binder角色,綁定VM層和Model層、VM層和View層的關(guān)系
- 采用大M方案送巡,以ModelService來承接數(shù)據(jù)的處理摹菠,以減輕VM層的數(shù)據(jù)處理壓力
- 抽象通用的數(shù)據(jù)處理的協(xié)議,根據(jù)不同的業(yè)務(wù)標(biāo)識注冊對應(yīng)的ModelService實(shí)現(xiàn)
(未完待續(xù)骗爆,代碼脫敏后繼續(xù)書寫)