Overview of Application Design Patterns

? 將要討論到的架構(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ù)展示屿岂。

image.png

虛線表示的是 runtime references , view layer 和 model layer 不是直接的去引用 controller,實(shí)線表示的是 compile-time references, controller 是知道 view 和 model object 的存在的和如何連接它們。

  1. Construction

    controller 設(shè)置 view 和 需要 data 的來源吁朦。controller 擁有 model layer

  1. Updating the Model

    在 MVC 中, controller 接收 view 的事件刻诊,controller 知道 view 的存在冲簿,但是 view 不知道 controller 的存在,當(dāng)有 view 的事件來了的時候,controller 知道改變他內(nèi)部的狀態(tài),改變 model 的狀態(tài),或直接改變 view 的狀態(tài)。

  2. 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 改變

  3. View Sate

    View State 由 viewController 或者 view 自行管理

  4. 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 自己。

image.png

VM 和 VC险毁,view 進(jìn)行分離了,方便測試们童,coordinator 的加入畔况,移除了 VC 相關(guān)的責(zé)任(呈現(xiàn)跳轉(zhuǎn)別的 VC)。

  1. 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ù)綁定
  2. 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 的更新
  3. 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 更新后會通知它的觀察者
  4. View State
    view state 可以在 view 或者 view-model 中汰蜘,和 MVC 不同的是,view controller 不含有 view state,當(dāng)使用 coordinators 的時候之宿,view controller 的 view state 交給它去管理
  5. 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


image.png
  1. 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 來反饋
  2. Changing the View
    controller 觀察 document model 和 view state model 的變化來更新 view
    4.View State
    View State 被明顯的區(qū)分出來苍凛,controller 觀察 document model 和 view state model 的變化來更新 view
  3. Testing
    在 MVC+VS 中測試流程很像 MVC,但是需要設(shè)置 document model 和 view state model,困難的部分是集合其他部分,測試 view state.

ModelAdapter-ViewBinder

MAVB 有 3 個重要的組成部分:view binders, model adaptersbindings

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


image.png
  1. Construction
    model adapter 包裝了 main model俘枫, view state adpater 包裝了 view state腥沽,view binders 是通過普通的函數(shù)來構(gòu)成的,它獲取 model adapter 的一些參數(shù)

  2. 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)

  3. 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 一樣

  1. 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)嗡载,沒有副作用。

image.png

  1. Construction
    state 通過 driver 構(gòu)建仍稀。store 是個單例洼滚,view 是通過 VVH 來計(jì)算當(dāng)前的狀態(tài)。

  2. Updating the Model
    Driver 接收到 message 后技潘,使用更新函數(shù)來改變狀態(tài)遥巴。

  3. Changing the View
    通過改變狀態(tài)來改變 view

  4. View State
    VS 也是在 state 中,state 的改變反應(yīng)到 view 上

  5. Testing
    只需要測試 VVH 它計(jì)算的 state 是否真確

?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末享幽,一起剝皮案震驚了整個濱河市挪哄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琉闪,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砸彬,死亡現(xiàn)場離奇詭異颠毙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)砂碉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蛀蜜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人增蹭,你說我怎么就攤上這事滴某。” “怎么了滋迈?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵霎奢,是天一觀的道長。 經(jīng)常有香客問我饼灿,道長幕侠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任碍彭,我火速辦了婚禮晤硕,結(jié)果婚禮上悼潭,老公的妹妹穿的比我還像新娘。我一直安慰自己舞箍,他們只是感情好舰褪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疏橄,像睡著了一般占拍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上软族,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天刷喜,我揣著相機(jī)與錄音,去河邊找鬼立砸。 笑死掖疮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颗祝。 我是一名探鬼主播浊闪,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼螺戳!你這毒婦竟也來了搁宾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤倔幼,失蹤者是張志新(化名)和其女友劉穎盖腿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體损同,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翩腐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了膏燃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茂卦。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖组哩,靈堂內(nèi)的尸體忽然破棺而出等龙,到底是詐尸還是另有隱情,我是刑警寧澤伶贰,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布蛛砰,位于F島的核電站,受9級特大地震影響黍衙,放射性物質(zhì)發(fā)生泄漏暴备。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一们豌、第九天 我趴在偏房一處隱蔽的房頂上張望涯捻。 院中可真熱鬧浅妆,春花似錦、人聲如沸障癌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涛浙。三九已至康辑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轿亮,已是汗流浹背疮薇。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留我注,地道東北人按咒。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像但骨,于是被迫代替她去往敵國和親励七。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容