? 將要討論到的架構(gòu)
- Standard Cocoa Model-View-Controller (MVC) Apple 官方提及到的架構(gòu)模式
- Model-View-ViewModel+Coordinator (MVVM-C) 是 MVC 的一種變種镰矿,分離出 view-model 和 coordinator 去管理 viewController 的層級苍姜,MVVM 使用 data binding 去建立 view-model 到 view layer 之間的關(guān)系
- Model-View-Controller+ViewState (MVC+VS) 將 view state 集中在單獨(dú)的位置
- ModelAdapter-ViewBinder(MAVB) MAVB 主要關(guān)注的是聲明 view 的構(gòu)造,然后使用 bind, 而不是使用 controllers 去建立 model 和 view 的通信
- The Elm Architecture (TEA) 它使用虛擬 view 來構(gòu)造 view layer 和使用 reducers 來和 model 和 views 交互
Model-View-Controller
? controller 接收所有 view actons, 處理所有相關(guān)的交互邏輯,然后觸發(fā)相關(guān)的 model actions,接受所有 model 改變的通知涩禀,為 view 準(zhǔn)備好相關(guān)的數(shù)據(jù)展示屿岂。
虛線表示的是 runtime references
, view layer 和 model layer 不是直接的去引用 controller,實(shí)線表示的是 compile-time references
, controller 是知道 view 和 model object 的存在的和如何連接它們。
-
Construction
controller 設(shè)置 view 和 需要 data 的來源吁朦。controller 擁有 model layer
-
Updating the Model
在 MVC 中, controller 接收 view 的事件刻诊,controller 知道 view 的存在冲簿,但是 view 不知道 controller 的存在,當(dāng)有 view 的事件來了的時候,controller 知道改變他內(nèi)部的狀態(tài),改變 model 的狀態(tài),或直接改變 view 的狀態(tài)。
-
Changing the View
在我們解釋的 MVC 中, 當(dāng)發(fā)生 view actions 的時候, model 改變了,controller 不應(yīng)該直接改變 view趋翻,而是 controller 訂閱 model 的通知讨惩,當(dāng) model 改變的通知來了处面,才改變 view或颊。view actions 另 model 改變平挑,然后 model 的改變發(fā)送通知唇辨,另 view 改變
-
View Sate
View State 由 viewController 或者 view 自行管理
-
Testing
在 MVC 中饿幅, controller 集合了其他層的東西,缺乏界限,所以難以測試纫版。
?
Model-View-ViewModel+Coordinator
? VM 可以直接暴露 view 所需要的屬性,然后同 data bind 來渲染绩社,因?yàn)?VM 沒有對 view layer 直接引用朴沿,所以相對獨(dú)立坚芜,所以在測試過程中屯仗,也相對獨(dú)立峰弹,方便測試
? 在 VM 中如果有一個 object 提供了界面的轉(zhuǎn)換窘茁,在 MVVM-C 中,這個對象叫做 coordinator。coordinator 知道 model layer 和 view controller 的層級結(jié)構(gòu),所以它可以為當(dāng) view controller 所需要 model 的這個點(diǎn)作出支持诡右。
? 不像 MVC,view controller 在 MVVM-C 中不直接引用其他 view controllers, view controller 通知 coordinator (通過某些機(jī)制,例如 delegate) 相關(guān)的 view actions.然后 coordinator 呈現(xiàn)新的 VC 并設(shè)置相關(guān)的 model data, view controller 的層級的管理是通過 coordinator搀继,而不是 view controller 自己。
VM 和 VC险毁,view 進(jìn)行分離了,方便測試们童,coordinator 的加入畔况,移除了 VC 相關(guān)的責(zé)任(呈現(xiàn)跳轉(zhuǎn)別的 VC)。
- Construction
model 的構(gòu)建還是和 MVC 的一樣沒有變慧库,有頂級的 controllers 來構(gòu)建跷跪,這里指的是構(gòu)建,但是對于單獨(dú)的 model 來說齐板,它是被 VM 所持有的吵瞻,而不是由 VC 持有,view 層的構(gòu)建和 MVC 差不多甘磨,但是和 MVC 中不同的是橡羞,VC 不之間為 view 做數(shù)據(jù)源的獲取和準(zhǔn)備工作。這個交給了 VM 去做济舆,VC 創(chuàng)建 VM,然后為 view 做數(shù)據(jù)綁定 - Updating the Model
MVVM 中卿泽,VC 接收事件和 MVC 中的一樣,當(dāng)事件到達(dá)滋觉,VC 不直接改變內(nèi)部的狀態(tài)签夭,view state 或者 model,而是調(diào)用 VM 的方法,然后通過 VM 改變內(nèi)部的狀態(tài)或者 model 的更新 - Changing the View
和 MVC 不同的是椎侠,VC 不觀察 model 的變化第租,而是,通過 VM 去觀察 model 的變化我纪,然后把 model 的變化轉(zhuǎn)化為某種能被 VC 感知到的方式慎宾,VC 訂閱 VM 的變化丐吓,VM 的事件到達(dá)了,VC 就更新 view璧诵。view-model 通常會發(fā)生 model 更新相關(guān)的 view actions 給 model,然后 model 更新后會通知它的觀察者 - View State
view state 可以在 view 或者 view-model 中汰蜘,和 MVC 不同的是,view controller 不含有 view state,當(dāng)使用 coordinators 的時候之宿,view controller 的 view state 交給它去管理 - Testing
因?yàn)?view-model 它和 view 和 controller 比較獨(dú)立了族操,所以 VM 方便測試,而不想 MVC 那樣比被,需要集合很多東西一起測試色难。
Model-View-Controller+ViewState
在 MVC+VS 中引入了一個新的模型 view state model,在 MVC+VS 中不再忽略 navigation 的更改等缀,row 的選擇枷莉,text field 的編輯,scroll position change 或者其他 view state 的變化尺迂。傳遞相關(guān)的 view state model action ,給 view state model,每個 view controller 觀察 view state model 的變化笤妙,它可以使改變邊的直觀,無論在是交互邏輯還是呈現(xiàn)邏輯噪裕。不在通過 view 來獲取 view state 的狀態(tài)蹲盘,而是通過 view state model
- Construction
controller 還是應(yīng)用 model data 到 view 中,view controller 訂閱 view state膳音。
2.Updating the Model
當(dāng)有 view acton 發(fā)生的時候召衔,view controller 改變 model 或者 view state model,我們不直接改變 view,而是祭陷,所有改變的操作都通過 document model 和 view state model 來反饋 - Changing the View
controller 觀察 document model 和 view state model 的變化來更新 view
4.View State
View State 被明顯的區(qū)分出來苍凛,controller 觀察 document model 和 view state model 的變化來更新 view - Testing
在 MVC+VS 中測試流程很像 MVC,但是需要設(shè)置 document model 和 view state model,困難的部分是集合其他部分,測試 view state.
ModelAdapter-ViewBinder
MAVB 有 3 個重要的組成部分:view binders
, model adapters
和 bindings
view binders 是包裝了 view 或者 view controller 的類兵志,它構(gòu)建 view 和 暴露一系列的綁定醇蝴,一系綁定是為 view 提供數(shù)據(jù),一些事發(fā)送事件
model apapter 是包裝了一些可變狀態(tài)毒姨,它通過 reducer
來實(shí)現(xiàn)哑蔫,model adpater 提供了輸入的綁定(發(fā)送事件)和 輸出綁定(接收更新)
MAVB 中不用直接創(chuàng)建 view,而是通過 view binders,view binder 和 model adapters 的變化是通過 bindings 來通信
MAVB 移除了 controller 層弧呐,構(gòu)建邏輯通過 view binders闸迷,變化邏輯通過 bindings,狀態(tài)的變化通過 model adapters
Construction
model adapter 包裝了 main model俘枫, view state adpater 包裝了 view state腥沽,view binders 是通過普通的函數(shù)來構(gòu)成的,它獲取 model adapter 的一些參數(shù)Updating the Model
view 可以發(fā)送動作鸠蚪,然后 view binding 允許 action binding,數(shù)據(jù)流是由 view 到 action binding,輸出連接了 model adapter,然后通過 binding 把信息轉(zhuǎn)到 model adapter,最后 MA 通過 reducer 來更新狀態(tài)Changing the View
model apater 的狀態(tài)改變了今阳,然后發(fā)送通知信號給 view binder师溅,然后更新 view
4.View State
view state 被看成 model layer 中一部分,view state actions 和 view state 通知和 model actions model notifications 一樣
- Testing
MAVB 中通過 view binders 來測試盾舌,測試 MAVB 和 MVVM 類似墓臭,它也是暴露了一些邏輯給 view controller,MAVB 中沒有 view controller,binding 是唯一一個地方在 MA 和 VB 中。
The Elm Architecture
TEA 中 model 和 view state 被集合到一個單獨(dú)的狀態(tài)模型中妖谴,發(fā)送的所有改變都通過給這個模型發(fā)送消息窿锉,然后出來消息的更新狀態(tài)的函數(shù)稱為 reducer
TEA 中狀態(tài)的改變通過創(chuàng)建新的 virtual view hierarchy
,它描述了 view 是怎么渲染的膝舅,virtual view hierarchy 允許我們通過純函數(shù)去實(shí)現(xiàn)嗡载,沒有副作用。
Construction
state 通過 driver 構(gòu)建仍稀。store 是個單例洼滚,view 是通過 VVH 來計(jì)算當(dāng)前的狀態(tài)。Updating the Model
Driver 接收到 message 后技潘,使用更新函數(shù)來改變狀態(tài)遥巴。Changing the View
通過改變狀態(tài)來改變 viewView State
VS 也是在 state 中,state 的改變反應(yīng)到 view 上Testing
只需要測試 VVH 它計(jì)算的 state 是否真確
?