在iOS開(kāi)發(fā)中蘋(píng)果定義了一套MVC的軟件架構(gòu)。前幾天,同事們聊起了MVC、MVP、MVVM等架構(gòu)的區(qū)別。今天,我也來(lái)對(duì)此給出一些自己的理解。
MVC
基本MVC模式
如下圖所示為基本的MVC(Model-View-Controller)模式結(jié)構(gòu)圖,可分為三部分:模型(Model)、視圖(View)、控制器(Controller)。其在MVC模式中所扮演的角色分別為:
Model:模型管理應(yīng)用程序的數(shù)據(jù),響應(yīng)有關(guān)其狀態(tài)信息(通常來(lái)自View)的請(qǐng)求,并響應(yīng)指令以更改狀態(tài)(通常來(lái)自Controller)。
View:視圖管理數(shù)據(jù)的展示。
Controller:控制器解釋用戶的輸入,并通知模型、視圖進(jìn)行狀態(tài)更新。
其中,View和Controller依賴于Model,而Model并不依賴于View和Controller。這種設(shè)計(jì)模式的優(yōu)點(diǎn)在于允許Model不受View的影響,從而能夠進(jìn)行獨(dú)立的構(gòu)建和測(cè)試。
此外,根據(jù)Model的具體實(shí)現(xiàn)還可以進(jìn)一步分為:主動(dòng)型Model、被動(dòng)型Model。
被動(dòng)型Model MVC模式
當(dāng)只有一個(gè)Controller操控著Model時(shí)可以采用被動(dòng)型Model。Controller定義Model,并在Model發(fā)生改變時(shí)通知View,后者再進(jìn)行更新。在這種場(chǎng)景下,Model完全獨(dú)立于View和Controller。實(shí)際上,被動(dòng)型Model MVC模式就是基本的MVC模式。
主動(dòng)型Model MVC模式
當(dāng)Model的狀態(tài)未受Controller干擾的情況下發(fā)生變化時(shí),使用主動(dòng)型Model。當(dāng)其他來(lái)源正在更改數(shù)據(jù)并且必須立刻反應(yīng)到View中時(shí),可能會(huì)發(fā)生這種情況。
為了實(shí)現(xiàn)主動(dòng)型Model,通常使用Observer模式來(lái)提供了一種機(jī)制來(lái)提醒其他對(duì)象的狀態(tài)變化,避免引入依賴關(guān)系。各個(gè)View實(shí)現(xiàn)Observer接口并向Model注冊(cè)。當(dāng)Model發(fā)生變化時(shí),Model會(huì)遍歷所有注冊(cè)的觀察者并通知他們相關(guān)的變化。這種方法通常被稱為“發(fā)布 - 訂閱”。Model從不需要關(guān)于任何View的任何信息。事實(shí)上,在Controller需要被告知Model變化的情況下(例如,啟用或禁用菜單選項(xiàng)),所有Controller必須通過(guò)實(shí)現(xiàn)Observer接口并訂閱Model的變化。
傳統(tǒng)版MVC
上述主動(dòng)型Model MVC模式通過(guò)加入Observer模式進(jìn)行了改良。事實(shí)上,隨著業(yè)務(wù)需求的變化,MVC模式通過(guò)不斷加入一些更基本的設(shè)計(jì)模式采演化成現(xiàn)在經(jīng)典的MVC模式。這些基本模式協(xié)同工作,定義了MVC應(yīng)用程序特有的功能分離和通信路徑。
上圖所示為傳統(tǒng)MVC設(shè)計(jì)模式,其通過(guò)Composition、Strategy、Observer等基本設(shè)計(jì)模式協(xié)同工作以實(shí)現(xiàn)。用戶操作在復(fù)合結(jié)構(gòu)的某個(gè)層次上操作View,生成一個(gè)事件。Controller接收事件,并進(jìn)行解釋。這個(gè)過(guò)程使用Strategy模式實(shí)現(xiàn),可以是通過(guò)消息請(qǐng)求一個(gè)Model對(duì)象來(lái)更新其狀態(tài)或請(qǐng)求一個(gè)View對(duì)象來(lái)更新其行為或外觀。Model對(duì)象則在其狀態(tài)改變時(shí)通知所有已注冊(cè)為觀察者的對(duì)象。如果觀察者是對(duì)象,則可以相應(yīng)更新其外觀。
蘋(píng)果版MVC
蘋(píng)果認(rèn)為傳統(tǒng)的MVC模式中,View通過(guò)Observer模式直接觀察Model對(duì)象以獲取相關(guān)的通知,而這樣的設(shè)計(jì)會(huì)導(dǎo)致View和Model對(duì)象不能被廣泛復(fù)用,因?yàn)閂iew與其觀察的Model之間存在耦合關(guān)系。因此,蘋(píng)果版MVC與傳統(tǒng)MVC基本一致,只是隔離了View和Model。
在iOS中,UIViewController和UIView是一一對(duì)應(yīng)的。隨著業(yè)務(wù)的深入,MVC最終一點(diǎn)點(diǎn)變成了Massive-View-Controller。
MVP
MVP(Modell-View-Presenter)模式就是為了解決MVC中Controller越來(lái)越臃腫的問(wèn)題,進(jìn)一步明確代碼分工。MVP與蘋(píng)果版MVC非常相似,但是它們的從屬關(guān)系有所不同(實(shí)線表示持有)。如下圖所示,MVP模式中View持有Presenter,Presenter持有Model,View不能直接訪問(wèn)Model;而MVC模式中Controller持有View和Model。
通過(guò)修改從屬關(guān)系,可以真正意義上實(shí)現(xiàn)將UI邏輯和數(shù)據(jù)邏輯隔離,而隔離之后就可以方便地對(duì)數(shù)據(jù)邏輯部分進(jìn)行單元測(cè)試。
在iOS中,MVP的實(shí)現(xiàn)一般如下圖所示。
MVVM
MVVM(Model View View-Model)就是為了解決MVP中Presenter過(guò)于臃腫的問(wèn)題。MVVM的思想是將Controller中UI控制邏輯與業(yè)務(wù)邏輯進(jìn)行分離,并抽離出一個(gè)View-Model來(lái)完成UI控制的邏輯。而Controller只需要負(fù)責(zé)業(yè)務(wù)邏輯即可。如下圖便是MVVM的結(jié)構(gòu)圖。
通常,View-Model可以調(diào)用Model定義的方法,從Model中獲取數(shù)據(jù)以用于View,并對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,使View可以直接使用。View又可以向View-Model發(fā)出用戶的操作命令,從而更改Model。MVVM實(shí)現(xiàn)了一種雙向綁定機(jī)制。
在iOS中,MVVM的實(shí)現(xiàn)一般如下圖所示。
MVVM的優(yōu)點(diǎn)在于:降低了View和Model之間的耦合;分離了業(yè)務(wù)邏輯和視圖邏輯。缺點(diǎn)在于:View和Model雙向綁定導(dǎo)致bug難以定位,兩者中的任何一方出現(xiàn)問(wèn)題,另一方也會(huì)出現(xiàn)問(wèn)題;增加了膠水代碼。
-
iOS
+關(guān)注
關(guān)注
8文章
3399瀏覽量
153013 -
架構(gòu)
+關(guān)注
關(guān)注
1文章
528瀏覽量
25970
發(fā)布評(píng)論請(qǐng)先 登錄
主流機(jī)器視覺(jué)軟件開(kāi)發(fā)平臺(tái)介紹及對(duì)比?

同一水平的 RISC-V 架構(gòu)的 MCU,和 ARM 架構(gòu)的 MCU 相比,運(yùn)行速度如何?

【HarmonyOS Next】ArkUI-X休閑益智接水果【進(jìn)階】
主流版本控制工具Git vs Perforce P4:架構(gòu)模式、性能、大文件管理及分支管理對(duì)比詳解

技術(shù)分享 | 如何在2k0300(LoongArch架構(gòu))處理器上跑通qt開(kāi)發(fā)流程

CY7C65215使用IOS中的USB CDC UART類(lèi)驅(qū)動(dòng)程序是否可以與IOS一起工作?
請(qǐng)問(wèn)TapLinx IOS SDK與Xcode 16不兼容嗎?
北京迅為RK3568開(kāi)發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)內(nèi)核HDF驅(qū)動(dòng)框架架構(gòu)

RISC-V架構(gòu)及MRS開(kāi)發(fā)環(huán)境回顧
【迅為電子】i.MX6UL和i.MX6ULL芯片區(qū)別與開(kāi)發(fā)板對(duì)比

Appium +iOS自動(dòng)化測(cè)試教程(實(shí)踐、總結(jié) 、踩坑)

Llama 3 模型與其他AI工具對(duì)比
risc-v與esp32架構(gòu)對(duì)比分析
9月26日云技術(shù)研討會(huì) | SOA整車(chē)EE架構(gòu)開(kāi)發(fā)流程及工具實(shí)施方案

評(píng)論