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