? ? ? ? ? ?
綜述:
MVC模式 --即 Model液肌、View、Controller焰络,是20世紀(jì)80年代戴甩,Xerox PARC 為程序語言 Smalltalk 發(fā)明的一種軟件設(shè)計模式。
Xerox Palo Alto Research Center闪彼,簡稱Xerox PARC甜孤,即施樂帕克研究中心,是施樂公司所成立的最重要的研究機(jī)構(gòu),帕克成立于1970年缴川,位于加利福尼亞州的帕洛阿圖市(Palo Alto)茉稠,坐落在山坡上,而山下就是舉世聞名的斯坦福大學(xué)把夸。
? ? ? 這種設(shè)計模式而线,如上圖,將一個應(yīng)用程序的所有對象分為三層:Model恋日、View吞获、Controller, 每層之間的通信規(guī)則都有嚴(yán)格的規(guī)定谚鄙。這使得每一層用有非常好的獨(dú)立性各拷,以此大幅度簡化開發(fā)者后續(xù)對程序的修改和擴(kuò)展工作,也使得對程序中某一部分代碼重復(fù)利用更為容易闷营,使我們的程序結(jié)構(gòu)更加的直觀烤黍,讓開發(fā)者集中精力到解決問題上來,可以說這是一種非常面向?qū)ο蟮脑O(shè)計模式傻盟,這也是這種設(shè)計模式至今為什么如此被廣泛的使用的原因速蕊。
詳解:
Model (模型):
實現(xiàn)應(yīng)用程序具體功能的主體,在這里娘赴,你可以進(jìn)行 保存應(yīng)用程序數(shù)據(jù)规哲、建立需要的類、實現(xiàn)應(yīng)用程序的算法诽表、數(shù)據(jù)管理等操作唉锌。例如,寫一個計算器應(yīng)用竿奏,那么袄简,具體的計算功能,如 加減乘除 泛啸,就應(yīng)該在Model中去實現(xiàn)绿语。
View (視圖):
應(yīng)用程序的UI部分,由交互控件組成(實則每一個控件也都是一個View)候址,由它與用戶進(jìn)行交互吕粹,獲取用戶
Controller (控制器):
這是一個媒介,負(fù)責(zé)監(jiān)聽View中的用戶交互事件岗仑,簡稱為事件匹耕,(例如點(diǎn)擊屏幕、滑動屏幕)赔蒲,Controller 會將事件根據(jù)開發(fā)者設(shè)定的規(guī)則處理為數(shù)據(jù)泌神,然后調(diào)用Model中對應(yīng)的具體的功能模塊處理數(shù)據(jù)良漱,再將處理后的數(shù)據(jù)根據(jù)開發(fā)者的設(shè)定更新View,這就完成了一個完整的用戶交互欢际。
例如母市,一個點(diǎn)擊計算器中 “+” 按鍵的交互過程: Controller監(jiān)聽到View中用戶點(diǎn)擊了 “+” 這個Button,就去調(diào)用 Model 中對應(yīng)的加法運(yùn)算方法损趋,然后更新View -- 將運(yùn)算結(jié)果顯示在View當(dāng)中患久。
交互規(guī)則:
Controller -> View/Model
如上圖
Controller 指向 View 的綠色箭頭,這說明的是 Controller 可以控制 View浑槽,完成UI的更新操作蒋失,而 Outlet,是指在 Controller 中聲明了一個屬性桐玻,這個屬性指向了 View 中的某一部分篙挽。
Controller也可以向Model通信,進(jìn)行調(diào)用Model中的方法等操作...
那么Model可以和View 通信嗎? 不可以镊靴! 在MVC模式中铣卡,要求 Model 與 UI 完全獨(dú)立,它不能涉及到任何與 UI 相關(guān)的東西偏竟。
View -> Controller
View如何與Controller通信煮落?MVC 模式 對這種通信有如下規(guī)定:View 對 Controller 的通信必須是盲目的 -- 它不能擁有自己要展示的數(shù)據(jù),也不能知道事件的用途踊谋。
由此蝉仇,分為事件通信和數(shù)據(jù)通信兩種方式。
如上圖
事件通信: View 只可以告訴 Controller 一個事件 殖蚕,但 View 不可以知道這個事件的用途轿衔、作用。這種通信常見的有兩種方式:
一嫌褪、一種用來處理簡單事件的方式呀枢,就是我們在iOS開發(fā)中經(jīng)常用到的 Action胚股。例如笼痛,在 View 中放置一個滑動條 — Slider。 當(dāng)用戶滑動了Slider 琅拌,View 只會告訴 Controller 這個 Slider 被滑動了缨伊, 但 View 不可以知道這個 Slider 的用途。(例如进宝,是被用來調(diào)節(jié)音量的還是調(diào)節(jié)亮度的)
二刻坊、一種用來處理復(fù)雜事件的方式,就是將Controller 設(shè)定為 View 的代理党晋, 即 Delegate谭胚。例如我們將常用到的 ScrollViewDelegate徐块,常見的有 did、should灾而、will 方法胡控。View 通過Delegate告訴 Controller ,用戶對 ScrollView 的一些操作旁趟,例如 將要滑動 ScrollView 昼激、開始滑動 ScrollView、已經(jīng)滑動了ScrollView锡搜, Controller 作為 Delegate 根據(jù)這些事件去完成相應(yīng)的操作橙困,例如在 ScrollView 邊界上禁止用戶繼續(xù)滑動。
如上圖
數(shù)據(jù)通信:
View不能擁有數(shù)據(jù)耕餐,它只能展示數(shù)據(jù)凡傅,而數(shù)據(jù)來自哪里?Model肠缔!然而 View 禁止和 Model 進(jìn)行通信像捶,所以就需要 Controller 作為媒介進(jìn)行數(shù)據(jù)交互,這種情況桩砰,即是一種特殊的代理 -- DataSource拓春。 ?Controller 作為 DataSource,常見的有 count亚隅、data硼莽、at等方法,告訴 View 如何顯示數(shù)據(jù)煮纵,有多少數(shù)據(jù)等懂鸵。
例如利用 TableView 展示1000首歌曲信息,TableView 不能直接擁有1000 首歌曲的信息并加載1000行列表行疏,(這樣也極為浪費(fèi)內(nèi)存)匆光,而應(yīng)該委托 Controller 作為 DataSource ,由 DataSource 告訴 TableView 屏幕上所能一次顯示的歌曲信息酿联、每一行采用怎樣的格式顯示歌曲信息终息。當(dāng)用戶滑動列表,則成為一個事件交互贞让,由 TableViewDelegate 判斷是否讓 DataSource 給 TableView 更多的數(shù)據(jù)信息周崭。
Model -> Controller
最后,當(dāng) Model 中的數(shù)據(jù)改變時喳张,它如何通知給 Controller 呢续镇? 這是一個類似于廣播的方式,Model 會將自己的數(shù)據(jù)改變了這一信息廣播出去销部,Controller 和 View 都可以接受到這一信息摸航,但根據(jù) MVC 模式規(guī)則制跟, 只能讓 Controller 來對這一信息作出反應(yīng)。 這種方式被稱為 ?Notification 或者 KVO 酱虎。(具體的到我學(xué)習(xí)了這一部分后會詳細(xì)講解)凫岖。
以上
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2016.5.10