MVC模式我們談得夠多了,但總有一些爭(zhēng)議,比如RAC說明文檔里關(guān)于MVC的描述是這樣的:

斯坦福大學(xué)的iOS公開課第一課:

中文維基百科上MVC條目的配圖:

乍一看,以上都是三角形,都描述了Model、View、Controller三者的關(guān)系,Controller都處于View與Model的中間位置。
這里再明確一下MVC的基本定義:
MVC模式(Model–view–controller)是軟件工程中的一種軟件架構(gòu)模式,把軟件系統(tǒng)分為三個(gè)基本部分:模型(Model)、視圖(View)和控制器(Controller)。
- (控制器 Controller)- 負(fù)責(zé)轉(zhuǎn)發(fā)請(qǐng)求,對(duì)請(qǐng)求進(jìn)行處理。
- (視圖 View) - 屏幕上顯示的UI,響應(yīng)用戶事件,接受用戶輸入。
- (模型 Model) - 程序員編寫程序應(yīng)有的功能(實(shí)現(xiàn)算法等等)、數(shù)據(jù)庫專家進(jìn)行數(shù)據(jù)管理和數(shù)據(jù)庫設(shè)計(jì)(可以實(shí)現(xiàn)具體的功能)。
簡(jiǎn)單的說,MVC只是定義了一個(gè)面向?qū)ο蟮能浖到y(tǒng)里,各個(gè)對(duì)象的角色。
三者概念并不難理解,難點(diǎn)在與這三者的交互關(guān)系,上面各方展示的關(guān)系里(線條表示),最大的差別在與Model 與 View 的關(guān)系,除了斯坦福那幅圖,其它都建立了View與Model 之間的聯(lián)系,無論間接還是直接。實(shí)際開發(fā)中,給一個(gè)TableViewCell 傳遞一個(gè)“Model”,也是常見做法。
但是,這樣對(duì)嗎?
這里我們想一下面向?qū)ο笤O(shè)計(jì)的目的:
面向?qū)ο蟮闹匾匦允欠庋b,而封裝的目的在于復(fù)用
比如一個(gè)閱讀APP中,圖書列表一個(gè)典型的TalbleViewCell是這樣的:

這時(shí),給這個(gè)TableView的Cell傳遞一個(gè)Book的Model對(duì)象,是很自然的,而且顯得很方便,畢竟Cell要展示的封面圖片、書名、簡(jiǎn)介、作者,Book對(duì)象都能提供。
再看另一個(gè)APP:

注意到,其實(shí)Cell的布局是很相似的

試想一個(gè)綜合類購物app,同時(shí)提供書籍和服裝列表,給cell傳book還是cloth類,都不合適,而是直接需要圖片的傳圖片,需要文字的傳文字:
// 注意這里是偽代碼
if object is class book
cell.image = object.coverImage
cell.title = object.title
else if object is class cloth
cell.image = object.image
cell.title = object.productName
我們看下蘋果官方如何描述mvc三者的關(guān)系:
可見,
蘋果的定義是View 與 Model 徹底分離,換句話說,這兩者并不知對(duì)方的存在!
再注意下斯坦福的示意圖,View 與 Model 之間是雙實(shí)線,
考過駕照的童鞋都知道其含義是 不要越界,
只有這樣,才能定義出可復(fù)用的對(duì)象,也符合了面向?qū)ο缶幊痰某踔裕?strong>抽象
MVC是Cocoa 框架的核心,蘋果要求任何類,必須是這三種角色之一。