Make everything as simple as possible, but not simpler — Albert Einstein*html
把每件事,作簡單到極致,但又不過於簡單 - 阿爾伯特·愛因斯坦ios
何爲設計模式編程
其實這三個解釋是一個意思,只是給出不一樣的說法幫助理解這個抽象的概念。swift
爲何用設計模式設計模式
OO(面向對象)設計原則網絡
OOP(面向對象編程)原則閉包
名稱 | 簡介 |
---|---|
單一職責 原則 | 類的職責要單一,不能將太多的職責放在一個類中 |
開閉原則 | 軟件實體對擴展是開放的,但對修改是關閉的,即在不修改一個軟件實體的基礎上去擴展其功能 |
里氏代換原則 | 在軟件系統中,一個能夠接受基類對象的地方必然能夠接受一個子類對象 |
依賴倒轉原則 | 要針對抽象層編程,而不要針對具體類編程 |
接口隔離原則 | 使用多個專門的接口來取代一個統一的接口 |
合成複用原則 | 在系統中應該儘可能多使用組合和聚合關聯關係,儘可能少使用甚至不使用繼承關係 |
迪米特法則 | 一個軟件實體對其餘實體的引用越少越好,或者說若是兩個類沒必要彼此直接通訊,那麼這兩個類就不該當發生直接的相互做用,而是經過引入一個第三者發生間接交互 |
MV(X)架構
MVC 設計模式mvc
以 IOS 開發爲例,這裏的 Controller
實際上是 UIViewController。異步
這個是理想中的模型,可是在實際開發過程當中,並無想象中那樣清晰。咱們不少人都會覺的這個模式下的 UIViewController 太臃腫了,並且大大下降了 Contrlller 的重用性。咱們在用這個模式的時候可能不少時候都是在考慮這樣一個問題,網路請求究竟是 Model 負責仍是 Controller 負責。
View和 Model 是相互獨立的這點很好,能夠方便後來的單元測試。可是,咱們通常會把複雜的業務邏輯放到 Controller 裏面,這形成了很難去測試 Controller 。IOS 開發中 View 的整個生命週期都是須要 Controller 來管理,這就形成了 View 和 Controller 之間存在嚴重的耦合現象,在項目龐大以後看起來會特別散亂。
MVP模式
以 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模式
以 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