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的關系圖,很是簡潔明了。