MVC設(shè)計模式
概述:Model-View-Controller(MVC),即模型-視圖-控制器。它將軟件系統(tǒng)分成三大部分: Model,View,Controller三個部分通過某種機制通信。
MVC的職能
M(model)
應(yīng)用程序的核心,用于處理應(yīng)用程序數(shù)據(jù)邏輯部分
V(View)
處理應(yīng)用程序數(shù)據(jù)的顯示,通常依據(jù)Model創(chuàng)建
C(Controll)
處理用戶的交互
從視圖讀取數(shù)據(jù),控制用戶輸入,并向模型發(fā)送數(shù)據(jù)
MVC之間的通信
圖解(出自斯坦福大學(xué)cs193課程的課件)
這個模式其實應(yīng)該叫做MCV,用控制器把model與view隔開才對,也就是model與view互相不知道對方的存在,沒有任何瓜葛,他們就像一個團隊里吵了架的同事,如果有項目需要他倆來參與,那么最好有第三者來管理他倆之間的溝通與協(xié)調(diào)。這個第三者就是控制器。
既然管理,那么姑且就把這個控制器提做項目經(jīng)理吧,這樣的話讓他倆干啥就得干啥。就像斯坦福老頭說的視圖就是控制器的狗腿子。讓我們來欣賞一下這張圖

先撇開那些亂七八糟的箭頭單看他們之間的分界線,view與controller、model與controller之間的線是虛的,而model與view之間的是雙黃線,考過駕照的知道越過這個線意味著什么吧。
控制器與視圖之間的大部分連線都可以在Xcode中通過按住ctrl來連接。例如outlet,例如delegate。有了這些連線,他們之間的溝通算是暢通無阻了。
1)用戶在view上的操作可以直接告訴控制器讓控制器去響應(yīng)
2)view需要的代理也可以指派給控制器讓控制器去完成
3)view需要的數(shù)據(jù)源也需要控制器來提供
總之,控制器很忙,因為它非常被動。
控制器還需要一個角色的參與:model
顧名思義,模型。我覺得使用asp.net里mvc的domain來描述比較好理解,領(lǐng)域。例如你要開發(fā)一個圖書管理系統(tǒng),模型里描繪的就是圖書的書名、售價、作者,誰借走了,幾號借走的,一切關(guān)于這個應(yīng)用領(lǐng)域的數(shù)據(jù)。
我們可以給模型一個簡單的定義:它描述了一個應(yīng)用所有需要抽象出來的數(shù)據(jù)結(jié)構(gòu)和這些數(shù)據(jù)之間的關(guān)系,還有他們獲取數(shù)據(jù)需要通過的途徑(本地的、遠程的)等。
有了模型,控制器想啥時候去拿數(shù),想怎么拿都行。
仔細觀察上面的圖,有控制器到model的箭頭,沒有model到控制器的箭頭。因為模型不需要知道控制器的存在,這樣可以減少耦合,提高代碼復(fù)用可能性。把你定義好的model挪到別的項目中,還可以使用。
但是問題來了,當model數(shù)據(jù)已經(jīng)更新了,被修改了,怎么通知相關(guān)的控制器?注意model上方有個天線,高端!之所以使用無線的,是因為model不知道更改要發(fā)給誰,但是model可以廣播,model的觀點:誰關(guān)心我的更改讓誰收聽去,我對誰收聽了我不感興趣。
廣播的方式有兩種:Notification 和 KVO(都是設(shè)計模式,本系列接下來會詳述)
好了,他們幾個之間的關(guān)系基本有個概念了。mvc模式就是這樣,把原本雜亂無章的類,分為三堆,嚴格監(jiān)管,按規(guī)則行事。
還是那句話:
說到底一切都是為了使類之間的耦合性更松散。好的代碼應(yīng)該對擴展開放,對修改關(guān)閉。
此圖解段轉(zhuǎn)自 http://www.gaoxiaoshuo.cn/limlee --- GeekLion
Controller與Model之間的通信
Controller可以主動向Model發(fā)起會話
Model職能被動地回復(fù)Controller發(fā)起的會話,不能主動請求Controller
Controller與View之間的通信
Controller可以完全操控View,因為Controller要把View顯示在屏幕上
View可以向Controller發(fā)送消息,因為View要將用戶的動作傳遞給Controller
Model與View之間無法直接通信
總結(jié):
Controller對Model——通過API
Controller對View ——通過Outlet
View對Controller ——Target-action,Delegate,Datasource
Model對Controller——Notification,KVO
View與Controller之間的通信方式
目標操作(target-action)
Controller內(nèi)會懸掛一個目標(target),并將一個操作(action)給將要和它交流的視圖對象,如圖解中的target與action
如,為View中的某個按鈕添加一個監(jiān)聽事件,當按鈕被點擊時就執(zhí)行相應(yīng)的處理
委托
為視圖中的某個視圖設(shè)置代理,當控件被操作時發(fā)送相應(yīng)的代理消息,執(zhí)行相應(yīng)的代理 方法,實現(xiàn)View與Controller的通信
如,tableView的代理
數(shù)據(jù)源
Controller通過數(shù)據(jù)源將View需要的數(shù)據(jù)傳遞給View,實現(xiàn)Controller與View的通信
新聞熱點
疑難解答