一、先來說一說我們ios中通常所理解的mvc
模型-檢視-控制器(model-view-controller,mvc)是xerox parc在20世紀80年代為程式語言smalltalk-80發明的一種軟體設計模式,至今已廣泛應用於使用者互動應用程式中。在
ios開發中
mvc的機制被使用的淋漓盡致,充分理解
ios的
mvc模式,有助於我們程式的組織合理性。
模型物件(model)
模型物件封裝了應用程式的資料,並定義操控和處理該資料的邏輯和運算。使用者在檢視層中所進行的建立或修改資料的操作,通過控制器物件傳達出去,最終會建立或更新模型物件。模型物件更改時(例如通過網路連線接收到新資料),它通知控制器物件,控制器物件更新相應的檢視物件。
檢視物件(view)
檢視物件是應用程式中使用者可以看見的物件。檢視物件知道如何將自己繪製出來,並可能對使用者的操作作出響應。檢視物件的主要目的,就是顯示來自應用程式模型物件的資料,並使該資料可被編輯。儘管如此,在 mvc 應用程式中,檢視物件通常與模型物件分離。
在ios應用程式開發中,所有的控制項、視窗等都繼承自 uiview,對應mvc中的v。uiview及其子類主要負責ui的實現,而uiview所產生的事件都可以採用委託的方式,交給uiviewcontroller實現。
控制器物件(controller)
在應用程式的乙個或多個檢視物件和乙個或多個模型物件之間,控制器物件充當媒介。控制器物件因此是同步管道程式,通過它,檢視物件了解模型物件的更改,反之亦然。控制器物件還可以為應用程式執行設定和協調任務,並管理其他物件的生命週期。
控制器物件解釋在檢視物件中進行的使用者操作,並將新的或更改過的資料傳達給模型物件。模型物件更改時,乙個控制器物件會將新的模型資料傳達給檢視物件,以便檢視物件可以顯示它。
對於不同的uiview,有相應的uiviewcontroller,對應mvc中的c。例如在ios上常用的uitableview,它所對應的controller就是uitableviewcontroller。
總結:1.model和view永遠不能相互通訊,只能通過controller傳遞。
2.controller可以直接與model對話(讀寫呼叫model),model通過notification和kvo機制與controller間接通訊。
3.controller可以直接與view對話,通過outlet,直接操作view,outlet直接對應到view中的控制項,view通過action向controller報告事件的發生(如使用者touch我了)。controller是view的直接資料來源(資料很可能是controller從model中取得並經過加工了)。controller是view的**(delegate),以同步view與controller。
以上是我們在ios中對於mvc的理解,其實最開始的時候的mvc與我們現在所說的mvc還是有點差異的,只是隨著時間的推移,人們對於mvc的認識和理解也在逐步發生變化,現在我們所理解的mvc其實更接近於mvp。
二、現在我們就最初的mvc以及從其演變而來的mvp和mvvm做一些介紹和總結
1.(原)mvc:
檢視(view):使用者介面;
控制器(controller):業務邏輯;
模型(model):資料儲存。
各部分之間通常的通訊方式如下:
view傳送命令到controller;controller完成業務邏輯後,要求model改變狀態;model將資料傳送到view進行顯示。
實際互動模式如下:
使用者可以向view傳送指令(dom事件),再由view直接要求model改變狀態(狀態改變由model自行控制,view只是提要求,保證model不依賴view
);也可以直接向controller傳送指令(改變url出發hash change事件),再由controller傳送給model;controller非常薄,只起到控制器的作用,而view非常厚,業務邏輯大都部署在view上。
view可以直接訪問model,從而,view裡會包含model資訊,不可避免的還要包括一些 業務邏輯。因此,導致要更改view也是比較困難的,至少那些業務邏輯是無法重用的。在mvc模型裡,更關注的model的不變,而同時有多個對model的不同顯示。所以,在mvc模型裡,model不依賴於view,但是 view是依賴於model的。
2.mvp
mvp模式將controller改名為presenter,同時改變了通訊方向,各部分之間的通訊都是雙向的,view與model不發生聯絡,都通過presenter傳遞;view非常薄,不部署任何業務邏輯,稱為「被動檢視」,沒有主動性,而presenter非常厚,所有業務邏輯都部署在那裡。
mvp是從經典的模式mvc演變而來,它們的基本思想有相通的地方:controller/presenter負責邏輯的處理,model提供資料,view負 責顯示。
作為一種新的模式,mvp與mvc有著乙個重大的區別:在mvp中view並不直接使用model,它們之間的通訊是通過presenter (mvc中的controller)來進行的,所有的互動都發生在presenter內部,presenter完全把model和view進行了分離,主要的程式邏輯在presenter裡實現。而且,presenter與具體的 view是沒有直接關聯的,而是通過定義好的介面進行互動,從而使得在變更view時候可以保持presenter的不變,即重用!
不僅如此,我們還可以編寫測試用的view,模擬使用者的各種操作,從而實現對presenter的測試--而不需要使用自動化的測試工具。 我們甚至可以在model和view都沒有完成時候,就可以通過編寫mock object(即實現了model和view的介面,但沒有具體的內容的)來測試presenter的邏輯。
目前我們提倡的mvc已經與mvp沒有太大區別,view依然是很薄的一層,不進行與model的邏輯處理,只進行簡單的頁面顯示的邏輯處理。
3.mvvm
mvvm將presenter改名為viewmodel,基本上與mvp模式完全一致,唯一的區別是它採用雙向繫結:view的變動自動反應在viewmodel上,反之亦然angular和ember都採用這種模式。
mvvm在概念上是真正將頁面與資料邏輯分離的模式,在開發方式上,它是真正將前台**開發者(js+html)與後台**開發者分離的模式(asp、asp.net、php、jsp)。當然,為了減少重複**量,前端人員有必要了解乙個資料庫結構。
mvc和mvp和mvvm的區別
mvc,mvp,mvvm設計架構的區別,相信大家對這幾個概念都有所了解。首先,明確一點,架構的目的就是為了提高開發效率,降低維護成本。利用物件導向的設計原則,對每個模組的職責進行合理的劃分,為了讓其他人更好的理解架構設計思想,然後給予每個模組乙個通用的名詞解釋,為了更好的說清楚資料繫結,這裡就簡單解...
MVP模式與MVVM模式
1 mvp模式 model層 presenter層 view 層 model層 資料層 ajax請求 view層 檢視層,頁面上的dom展示 jquery 的編寫就屬於mvp模式 提交 button ul id list ul div script function page extend page...
MVC與MVP的區別
1.mvp是針對於高階開發工程師和架構師使用,mvp主要目的是 1 為了提高系統應用的擴充套件性,後期在修改以及維護 增加功能模組時,修改的地方越少越好 2 為了把m和v的耦合性降低,即解決邏輯和檢視之間的鬆散耦合性問題,減輕了view的工作壓力,在安卓的view指的是activity 3 在mvp...