iOS設計模式——MVC(Model-View-Controller)

Modol View Controller(MVC)是一種最早的也是最成功的可重用的設計模式,70年代的時候首次在smaltalk編寫的程序中成功使用。基於MVC設計模式,Cocoa整體架構可以劃分爲三個子系統:Model, View, Controller,我們可以相應的理解爲:數據模型,視圖和控制器。


Modol View和Controller的角色

要想理解MVC設計模式中每個子系統的角色,我們就需要理解一個應用程序的功能和行爲。我們知道一個應用程序通常需要存儲數據信息,檢索數據信息以及把這些數據信息呈現給用戶,同時還要允許用戶對數據進行編輯(增刪查改等操作)。那麼MVC的角色就分別爲:

Model: 爲應用程序提供獨立的,不依賴於View和Controller子系統的數據模型。

View: 以一定的形式像用戶呈現數據並允許用戶對數據進行操作。理解View的關鍵是要理解同樣的數據可以有不同的呈現方式,可以以列表的形式顯示,可以以圖片的形式顯示,有時根據需求只需顯示部分數據。

Controller: 在Model和View之間加入一個Controller的主要目的就是“去耦”,即消除Model和View之間的耦合性。用戶和View交互時,View會通知Controller在View中有數據發生了更改,而Controller則會將這個數據的改變反應到Model中。Controller在這個過程中扮演轉義數據的角色(因爲呈現在View中的數據可能是便於用戶閱讀的文字或是數字,而存儲在Model中的數據可能是比較高效但不便於直接閱讀的二進制或是其他存儲方式比如關係數據庫,Controller可以承擔轉化這兩種數據形式的職責)。

Controller的去耦作用如下圖示(注:本文所用插圖來源於書《Cocoa Design Pattern》, Erik M.Buck 和 Donald A.Yacktman著):


第一步,滑動按鈕發生變化,發送一個消息給Controller;第二步,Controller發送消息告訴Model按鈕位置發生了變化需要更新數據Value;第三步,Model更新完數據通知Controller;第四步,Controller完成對View中其他需要更新的 View控件的更新,比如上面的文字輸入框。

在上面的整個過程可能你會覺得Model和View明明可以直接交互,爲什麼要引入Controller呢?原因就是,View通常會經常根據用戶需求而發生改變(相信經常和客戶打交道的朋友對此感觸頗深),而且用戶數據格式有時候也會發生改變(比如客戶要求數據需要從mysql數據庫遷移到oracle),這樣把View和Model分離出來就顯得極其重要了。


Cocoa中的MVC

在Cocoa框架中,可以說MVC設計模式被用到了極致。不但整個框架是基於MVC設計的(見下圖),而且在更小的範圍內也廣泛使用了MVC。


Core Data簡化了很多應用程序的Model部分的設計;ApplicationKit包含了View, Controller通用的一些類。Foundation提供了對操作系統接口,NSObject基類,腳本支持以及其他特性的訪問。


小結

MVC設計模式減少了程序中模塊間的耦合性,但是有時候也增加了程序的複雜度。從長遠來講,MVC這樣一個清晰的子系統分離設計可以減少系統的維護開銷並且可以很方便的實現系統功能的增強和擴展。另外一個考慮就是,子系統的分離對軟件測試工作也帶來了很大的方便,比如我們可以直接測試升級了的系統Model,而不一定非得通過用戶界面來測試,因爲當通過用戶界面測試失敗時,我們不知道到底是界面導致的還是Model本身導致的或是兩者同時引起的。再有就是,通常一個系統的View和Model是由不同的團隊開發的,這樣每個子系統的清晰分離就顯得尤爲重要了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章