MVC模式最早由Trygve Reenskaug在1978年提出[1] ,是施樂帕羅奧多研究中心(Xerox PARC)在20世紀80年代為程式語言Smalltalk發明的一種軟體設計模式。MVC模式的目的是實現一種動態程式設計,使後續對程式的修改和擴充簡化,並且使程式某一部分的重複利用成為可能。除此之外,此模式通過對複雜度的簡化,使程式結構更加直觀。軟體系統通過對自身基本部分分離的同時也賦予了各個基本部分應有的功能。 ---(維基百科)
MVC 提出後,得到了廣泛的應用。 MFC,J2EE, Java Swing,.NET Perl Ruby on Rails,Python,JavaScript,PHP,ActionScript3 等都有各自實現。對於IOS開發,同樣用到MVC。下面就MVC在IOS 開發中的一些情況做做簡單的介紹。
模型—反應你的程式是什麼. 但它不關心如何展示
控制器—你的模型如何展示給使用者. 它關心UI邏輯
視圖—渲染資料, 展示給使用者並接收使用者反饋。
MVC的所有內容就是在對上述三者的分工及通訊。
1) Controller 可以直接和 model,view 通訊
一般用法是controller直接引用model,view 執行個體對象。
2) Model 和 view 不應該直接通訊
3) View 與 controller 之間的通訊
a) View接收一些使用者事件,但並不涉及業務處理。所以一般是通過protocol-delegate方法,把使用者事件傳回給控制器處理
b) View 不能擁有資料,但view的展示需要資料。一般也是通過協議去擷取。例如UITableView,其擷取資料的方式就是通過定義UITableViewDatasource 這個協議去擷取。
4) Controller 一般會作為資料來源(而不是模型)。
同樣,參考UITableViewController,其實現了 UITableViewDataSource, 而不是model實現該協議。
5) Controller 並要時需解析/格式化 model返回的資料給View
View 不關注商務邏輯。 Model 不關注view。這就導致model返回資料,可以在某些情況下並不適於view直接展示。因此,這時controller 一般需要先針對view的需要處理好資料,然後才交給view。
另一典型情況是系統錯誤資訊的處理。系統報錯資訊五花八門,但不是每一條資訊都適合直接給使用者展示。因此,controller 這時也是需要對錯誤資訊先進行處理,然後才能允許存取,交給view。
6) Model 與 controller 通訊?
Model 應該是跟UI 獨立的。如果model 有資訊需要更新或者其他任意事件需要反饋,一般使用訊息/通知模式。
例如一些幕後處理程式:郵件重新整理,資料統計等… 使用者並不關心(無UI觸發),但又需要提示使用者。這時可以在相應的controller設立訊息接收器,而model,則在需要觸發響應時,通過通知的方式,把資訊發放出去。而它自己,其實是不理會訊息的後續的情況的。
下面是從斯坦福教程中的一副MVC的關係圖,很是簡潔明了。