簡述 MVC, MVP, MVVM三種模式

Make everything as simple as possible, but not simpler — Albert Einstein*html

把每件事,作簡單到極致,但又不過於簡單 - 阿爾伯特·愛因斯坦ios

何爲設計模式編程

  • 具備某種重複性規律的方案,就是設計過程當中能夠反覆使用的、能夠解決特定問題的設計方法
  • 設計模式是針對特定上下文的特定問題的解決方案,這種解決方案被抽象化、模版化,就是設計模式
  • 是一種解決問題的思惟,而並不是某種特定的方法

其實這三個解釋是一個意思,只是給出不一樣的說法幫助理解這個抽象的概念。swift

爲何用設計模式設計模式

  • 設計模式也能夠幫助你提高思考架構的層次到模式層面,而不是停留在瑣碎的對象上。
  • 方便交流, 把隱形知識清晰地表達出來, 而不在於編碼路線圖。
  • 讓項目在龐大以後結構仍是能很是清晰,不讓代碼失控。
  • 顯得專業,更加裝X (呵呵)

OO(面向對象)設計原則網絡

  • 找出應用中可能須要變化之處,把它們獨立出來, 不要和那些不須要變化的代碼混在一塊兒。這是咱們的第一個設計原則。
  • 針對接口編程,而不是針對實現編程。
  • 多用組合,少用繼承。

OOP(面向對象編程)原則閉包

名稱 簡介
單一職責 原則 類的職責要單一,不能將太多的職責放在一個類中
開閉原則 軟件實體對擴展是開放的,但對修改是關閉的,即在不修改一個軟件實體的基礎上去擴展其功能
里氏代換原則 在軟件系統中,一個能夠接受基類對象的地方必然能夠接受一個子類對象
依賴倒轉原則 要針對抽象層編程,而不要針對具體類編程
接口隔離原則 使用多個專門的接口來取代一個統一的接口
合成複用原則 在系統中應該儘可能多使用組合和聚合關聯關係,儘可能少使用甚至不使用繼承關係
迪米特法則 一個軟件實體對其餘實體的引用越少越好,或者說若是兩個類沒必要彼此直接通訊,那麼這兩個類就不該當發生直接的相互做用,而是經過引入一個第三者發生間接交互

MV(X)架構

  • Models(模型)數據層,負責處理數據,數據接口層
  • Views(視圖)展現層(GUI) 負責建立與展現 UI
  • Controller、Presenter、ViewModel 主要是用來負責Model 和 View的溝通。

MVC 設計模式mvc

mvc.png

以 IOS 開發爲例,這裏的 Controller 實際上是 UIViewController。異步

這個是理想中的模型,可是在實際開發過程當中,並無想象中那樣清晰。咱們不少人都會覺的這個模式下的 UIViewController 太臃腫了,並且大大下降了 Contrlller 的重用性。咱們在用這個模式的時候可能不少時候都是在考慮這樣一個問題,網路請求究竟是 Model 負責仍是 Controller 負責。

View和 Model 是相互獨立的這點很好,能夠方便後來的單元測試。可是,咱們通常會把複雜的業務邏輯放到 Controller 裏面,這形成了很難去測試 Controller 。IOS 開發中 View 的整個生命週期都是須要 Controller 來管理,這就形成了 View 和 Controller 之間存在嚴重的耦合現象,在項目龐大以後看起來會特別散亂。

MVP模式

mvp.png

以 IOS 開發爲例,這裏的 View 實際上是 UIViewController。

它是由 MVC 演變而來的,最大的變化莫過於上面這句話。對 MVP 的 Presenter 根本不用關心 ViewController 的生命週期,因此在 Presenter 裏面幾乎沒有涉及到 UI 的代碼,咱們全部的 UI 處理所有放到了 UIViewController 裏面,這樣的話很符合以前說的單一職責。

這裏要強調一下 MVP 模式的是雙向通訊的,咱們看一段代碼

// Assembling of MVP
let model = Person(firstName: "David", lastName: "Blaine")
let view = GreetingViewController()
let presenter = GreetingPresenter(view: view, person: model)
view.presenter = presenter

在這裏面 presenter 同時持有 Model 和 View 兩個對象,當用戶操做 View 而後調用 Presenter 來改變 Model,Model 更新完畢後,presenter 調用 View 的方法來更新 UI。

MVVM模式

mvvm.png

以 IOS 開發爲例,這裏的 View 實際上是 UIViewController。

這個模式徹底是由 MVP 進化過來的,它和 MVP 的不一樣點在於 ViewModel 和 View 之間的通訊採用的是數據綁定,ViewModel 不像 MVP 中的 presenter直接持有 View 對象,在這個模式中,ViewModel沒法直接調用 View 來更新 UI 而是經過事件回調的方式來通知 View 更新,好比經過協議、通知、代理、閉包等等一些方式來異步的更新 UI。這是跟 MVP 最大的區別。這個是爲了知足UI層更加細節化、可定製化。

// Assembling of MVVM
let model = Person(firstName: "David", lastName: "Blaine")
//View中實現了delegate
let view = GreetingViewController()
let viewModel = GreetingViewModel(person: model)
//讓 ViewMode 持有此代理
viewModel.delegate = view
view.viewModel = viewModel

以上就是我本身對三種模式的理解,但願對你們有所幫助,若有錯誤還請留言指出。

參考連接:

http://john-kong19.iteye.com/blog/934105

http://www.jianshu.com/p/b42a26623aeb

http://www.jianshu.com/p/75fab47aaacc

http://www.programmer-club.com.tw/showSameTitleN/c/42739.html

http://willtea.iteye.com/blog/1704806

http://blog.csdn.net/txchen/article/details/1554361

https://blog.coding.net/blog/ios-architecture-patterns

http://blog.csdn.net/tyk0910/article/details/51120898

http://blog.csdn.net/wqc_CSDN/article/details/53749848

相關文章
相關標籤/搜索