最近在學(xué)習(xí)設(shè)計模式算吩,自己做了個小demo佃扼。下面記錄下
實際iOS開發(fā)中的MVC模式中,controller模塊跟view模塊緊密耦合压昼,很容易形成胖controller窍霞,可單元測試弱拯坟。但能快速開發(fā)。MVP模式把傳統(tǒng)的iOS開發(fā)的MVC模式下比較完美的展示冷溃。使用Presenter模塊當(dāng)做controller梦裂。把傳統(tǒng)的UIViewController跟UIView當(dāng)作view模塊,綁定view跟model菠净。這個設(shè)計模式增強了代碼的單元測試。MVP跟MVC都存在一個問題牵咙,很容易形成胖的viewController跟胖的presenter攀唯。而MVVM 中使用的是響應(yīng)式viweModel 是個中介者。它做數(shù)據(jù)處理另凌,雙向綁定技術(shù)戒幔,當(dāng)Model變化時,View-Model會自動更新工坊,View也會自動變化王污。很好做到數(shù)據(jù)的一致性楚午,不用擔(dān)心,在模塊的這一塊數(shù)據(jù)是這個值,在另一塊就是另一個值了。所以 MVVM模式有些時候又被稱作:model-view-binder模式啊易。 MVVM的缺點是難以調(diào)式租谈。數(shù)據(jù)綁定使得一個位置的 Bug 被快速傳遞到別的位置捆愁,要定位原始出問題的地方就變得不那么容易了。?
MVC
以上所述呻逆,似乎Cocoa MVC 看起來是一個相當(dāng)差的架構(gòu)方案咖城。我們來重新評估一下文章開頭我們提出的MVC一系列的特征:
任務(wù)均攤--View和Model確實是分開的,但是View和Controller卻是緊密耦合的
可測試性--由于糟糕的分散性宜雀,只能對Model進行測試
易用性--與其他幾種模式相比最小的代碼量。熟悉的人很多悴品,因而即使對于經(jīng)驗不那么豐富的開發(fā)者來講維護起來也較為容易简烘。
如果你不想在架構(gòu)選擇上投入更多精力,那么Cocoa MVC無疑是最好的方案届氢,而且你會發(fā)現(xiàn)一些其他維護成本較高的模式對于你所開發(fā)的小的應(yīng)用是一個致命的打擊悼沈。
“就開發(fā)速度而言姐扮,Cocoa MVC是最好的架構(gòu)選擇方案茶敏「壳危”
總結(jié)
vc中子類view跟model,
MVP
MVP是第一個如何協(xié)調(diào)整合三個實際上分離的層次的架構(gòu)模式恬惯,既然我們不希望View涉及到Model亚茬,那么在顯示的View Controller(其實就是View)中處理這種協(xié)調(diào)的邏輯就是不正確的,因此我們需要在其他地方來做這些事情碗暗。例如梢夯,我們可以做基于整個App范圍內(nèi)的路由服務(wù),由它來負(fù)責(zé)執(zhí)行協(xié)調(diào)任務(wù)噪奄,以及View到View的展示。這個出現(xiàn)并且必須處理的問題不僅僅是在MVP模式中都毒,同時也存在于以下集中方案中叙谨。
我們來看下MVP模式下的三個特性的分析:
任務(wù)均攤--我們將最主要的任務(wù)劃分到Presenter和Model,而View的功能較少(雖然上述例子中Model的任務(wù)也并不多)涤垫。
可測試性--非常好竟终,由于一個功能簡單的View層,所以測試大多數(shù)業(yè)務(wù)邏輯也變得簡單
易用性--在我們上邊不切實際的簡單的例子中榆芦,代碼量是MVC模式的2倍喘鸟,但同時MVP的概念卻非常清晰
“iOS 中的MVP意味著可測試性強、代碼量大崎淳°蛋眩”
總結(jié)
在viewController中只有view屬于它的子類,model不屬于嚣镜。model放在presenter中橘蜜。
Presenter把model跟view綁定扮匠,
MVVM
Model層是少不了的了,我們得有東西充當(dāng)DTO(數(shù)據(jù)傳輸對象)疹蛉,當(dāng)然力麸,用字典也是可以的育韩,編程么筋讨,要靈活一些摸恍。
ViewModel層,就是View和Model層的粘合劑立镶,他是一個放置用戶輸入驗證邏輯,視圖顯示邏輯嗜逻,發(fā)起網(wǎng)絡(luò)請求和其他各種各樣的代碼的極好的地方缭召。說白了,就是把原來* ViewController層的業(yè)務(wù)邏輯和頁面邏輯等剝離出來放到ViewModel層萄凤。
View層搪哪,就是ViewController層,他的任務(wù)就是從ViewModel層獲取數(shù)據(jù),然后顯示神年。 上面對MVVM就先簡單的這么一說,好好的理解并應(yīng)用的話已日,還得實戰(zhàn)。
總結(jié)
把處理數(shù)據(jù)邏輯放到viewmodel里堂鲜,viewController只需要接收返回的數(shù)據(jù)缔莲。
VC上綁定一個viewModel ,viewModel處理完數(shù)據(jù)后通知view刷新霉旗。VC的屬性有viewModel跟view, viewModel屬性有model蛀骇。viewModel獲得model數(shù)據(jù)读拆,通過viewModel接收事件。viewModel層是處理model數(shù)據(jù)后返回最后的結(jié)果給view暑诸。