MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設(shè)計(jì)典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí),不需要重新編寫業(yè)務(wù)邏輯。MVC被獨(dú)特的發(fā)展起來用于映射傳統(tǒng)的輸入、處理和輸出功能在一個(gè)邏輯的圖形化用戶界面的結(jié)構(gòu)中。
MVC開始是存在于桌面程序中的,M是指業(yè)務(wù)模型,V是指用戶界面,C則是控制器,使用MVC的目的是將M和V的實(shí)現(xiàn)代碼分離,從而使同一個(gè)程序可以使用不同的表現(xiàn)形式。比如一批統(tǒng)計(jì)數(shù)據(jù)可以分別用柱狀圖、餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應(yīng)該同步更新。
Model(模型)表示應(yīng)用程序核心(比如數(shù)據(jù)庫記錄列表)。
View(視圖)顯示數(shù)據(jù)(數(shù)據(jù)庫記錄)。
Controller(控制器)處理輸入(寫入數(shù)據(jù)庫記錄)。
MVC 模式同時(shí)提供了對 HTML、CSS 和 JavaScript 的完全控制。
**Model****(模型)**是應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部分。
通常模型對象負(fù)責(zé)在數(shù)據(jù)庫中存取數(shù)據(jù)。
**View****(視圖)**是應(yīng)用程序中處理數(shù)據(jù)顯示的部分。
通常視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的。
**Controller****(控制器)**是應(yīng)用程序中處理用戶交互的部分。(只控制交互 負(fù)責(zé)數(shù)據(jù)的傳遞 不做展示數(shù)據(jù)和數(shù)據(jù)解析)
通常控制器負(fù)責(zé)從視圖讀取數(shù)據(jù),控制用戶輸入,并向模型發(fā)送數(shù)據(jù)。
MVC 分層有助于管理復(fù)雜的應(yīng)用程序,因?yàn)槟梢栽谝粋€(gè)時(shí)間內(nèi)專門關(guān)注一個(gè)方面。例如,您可以在不依賴業(yè)務(wù)邏輯的情況下專注于視圖設(shè)計(jì)。同時(shí)也讓應(yīng)用程序的測試更加容易。
MVC 分層同時(shí)也簡化了分組開發(fā)。不同的開發(fā)人員可同時(shí)開發(fā)視圖、控制器邏輯和業(yè)務(wù)邏輯。
MVC并不適合小型甚至中等規(guī)模的應(yīng)用程序,花費(fèi)大量時(shí)間將MVC應(yīng)用到規(guī)模并不是很大的應(yīng)用程序通常會(huì)得不償失。
MVC設(shè)計(jì)模式是一個(gè)很好創(chuàng)建軟件的途徑,它所提倡的一些原則,像內(nèi)容和顯示互相分離可能比較好理解。但是如果你要隔離模型、視圖和控制器的構(gòu)件,你可能需要重新思考你的應(yīng)用程序,尤其是應(yīng)用程序的構(gòu)架方面。如果你肯接受MVC,并且有能力應(yīng)付它所帶來的額外的工作和復(fù)雜性,MVC將會(huì)使你的軟件在健壯性,代碼重用和結(jié)構(gòu)方面上一個(gè)新的臺(tái)階。
圖中有幾條線把這三部分劃分開,有黃線,虛線,和白色的實(shí)線。我們把它們想象成路標(biāo)。你可以看到,在M和V之間有兩條黃線,這表示什么呢?它意味著你不能 穿越這黃線,任何一個(gè)方向都不行,即M和V完全分離。在圖的上部,你可以看到白色的虛線,它意味著你可以自由的穿越它,只要是安全的。那白色的實(shí)線呢?它代表你可以穿越,但你必須要買票,或者交點(diǎn)過路費(fèi)。
首先, 我們來看C和M之間的綠色箭頭,這箭頭的方向就代表著“發(fā)起對話”的方向,也就是說,發(fā)起對話的是C,而做出回答的是M。C可以問M各種各樣的問題,但M 只是回答C的問題或要求,它不可以主動(dòng)的向C要求什么。還記得虛線是暢通無阻的意思吧,所以,C知道M的所有的事情,如果用代碼來說明這件事情,就是 說,C可以導(dǎo)入M的頭文件或是M的接口(API)。因?yàn)镃可以通過M的API,所以它就可以肆無忌憚的向M要求這要求了
我們再來看看另外的一個(gè)綠色箭頭,它是在C和V之間,和前一個(gè)綠色箭頭的意義一樣,它代表C可以直接地向V進(jìn)行交流。你可以想想,C要把V放到屏幕 上,并設(shè)置V的屬性,告訴它們什么時(shí)候從屏幕上消失,把它們分成組等等。如果C不能自由的向V發(fā)號(hào)施令的話,程序的顯示將會(huì)多么的困難,所以,C可以毫無 限制地向V說話。
[btn addTarget:self action:@selector(opencCurrentSection:) forControlEvents:UIControlEventTouchUpInside];
第一種我們稱為目標(biāo)操作(target-action)。它是這樣工作的,C會(huì)在自己的內(nèi)部“懸掛”一個(gè)目標(biāo)(target),如圖中的紅白相間的靶子,對應(yīng)的,它還會(huì)分發(fā)一個(gè)操作(action,如圖中的黃色箭頭)給將要和它交流的視圖對象(可能是屏幕上的一個(gè)按鈕),當(dāng)按鈕被按時(shí),action 就會(huì)被發(fā)送給與之對應(yīng)的target,這樣V就可以和C交流了。但是在這種情況下,V只是知道發(fā)送action給對應(yīng)的target,它并不知道C中的 類,也不知道它到底發(fā)送了什么。target-action是我們經(jīng)常使用的方法。
第二種方式我們叫做委托(delegate)。有時(shí)候,V需要和C進(jìn)行同步,你知道,用戶交互不僅僅是什么按按鈕,劃滑塊,還有很多種形式。讓我們來看看圖中的delegate黃色箭頭,你發(fā)現(xiàn)箭頭上又分出了四個(gè)小箭頭:should,did,will,還有一個(gè)沒標(biāo)注的。絕大部分的 delegate信息都是should,will,did這三種形式。和英文意思相對應(yīng),should代表視圖對象將詢問C中的某個(gè)對象“我應(yīng)該這么做么?”,那will和did呢?will就是“我將要做這件事了”,did就是“我已經(jīng)做了這件事”。C把自己設(shè)置為V的委托(delegate),它讓V知道:如果V想知道更多的關(guān)于將如何顯示的信息的話,就向C發(fā)送delegate信息。通過接受V發(fā)過來的delegate信息,C就會(huì)做出相應(yīng)的協(xié)調(diào)和處理。還有一點(diǎn),每個(gè)V只能有一個(gè)delegate。
第三種方式就是數(shù)據(jù)源(datasource),你知道,V不能擁有它所要顯示的數(shù)據(jù),記住這點(diǎn)非常重要。V希望別人幫助它管理將要顯示的數(shù)據(jù),當(dāng)它需要數(shù)據(jù)時(shí),它就會(huì)請求別人的幫助,把需要的數(shù)據(jù)給它。再者,iphone的屏幕很小,它不能顯示包含大量信息的視圖??磮D中的datasource箭頭,和delegate類似,V會(huì)發(fā)送cout,data at信息給C來請求數(shù)據(jù)。