Overview of Application Design Patterns

​ 将要讨论到的架构

  • Standard Cocoa Model-View-Controller (MVC) Apple 官方提及到的架构模式
  • Model-View-ViewModel+Coordinator (MVVM-C) 是 MVC 的一种变种,分离出 view-model 和 coordinator 去管理 viewController 的层级,MVVM 使用 data binding 去建立 view-model 到 view layer 之间的关系
  • Model-View-Controller+ViewState (MVC+VS) 将 view state 集中在单独的位置
  • ModelAdapter-ViewBinder(MAVB) MAVB 主要关注的是声明 view 的构造,然后使用 bind, 而不是使用 controllers 去建立 model 和 view 的通信
  • The Elm Architecture (TEA) 它使用虚拟 view 来构造 view layer 和使用 reducers 来和 model 和 views 交互

Model-View-Controller

​ controller 接收所有 view actons, 处理所有相关的交互逻辑,然后触发相关的 model actions,接受所有 model 改变的通知,为 view 准备好相关的数据展示。

image.png

虚线表示的是 runtime references , view layer 和 model layer 不是直接的去引用 controller,实线表示的是 compile-time references, controller 是知道 view 和 model object 的存在的和如何连接它们。

  1. Construction

    controller 设置 view 和 需要 data 的来源。controller 拥有 model layer

  1. Updating the Model

    在 MVC 中, controller 接收 view 的事件,controller 知道 view 的存在,但是 view 不知道 controller 的存在,当有 view 的事件来了的时候,controller 知道改变他内部的状态,改变 model 的状态,或直接改变 view 的状态。

  2. Changing the View

    在我们解释的 MVC 中, 当发生 view actions 的时候, model 改变了,controller 不应该直接改变 view,而是 controller 订阅 model 的通知,当 model 改变的通知来了,才改变 view。view actions 另 model 改变,然后 model 的改变发送通知,另 view 改变

  3. View Sate

    View State 由 viewController 或者 view 自行管理

  4. Testing

    在 MVC 中, controller 集合了其他层的东西,缺乏界限,所以难以测试。

Model-View-ViewModel+Coordinator

​ VM 可以直接暴露 view 所需要的属性,然后同 data bind 来渲染,因为 VM 没有对 view layer 直接引用,所以相对独立,所以在测试过程中,也相对独立,方便测试

​ 在 VM 中如果有一个 object 提供了界面的转换,在 MVVM-C 中,这个对象叫做 coordinator。coordinator 知道 model layer 和 view controller 的层级结构,所以它可以为当 view controller 所需要 model 的这个点作出支持。

​ 不像 MVC,view controller 在 MVVM-C 中不直接引用其他 view controllers, view controller 通知 coordinator (通过某些机制,例如 delegate) 相关的 view actions.然后 coordinator 呈现新的 VC 并设置相关的 model data, view controller 的层级的管理是通过 coordinator,而不是 view controller 自己。

image.png

VM 和 VC,view 进行分离了,方便测试,coordinator 的加入,移除了 VC 相关的责任(呈现跳转别的 VC)。

  1. Construction
    model 的构建还是和 MVC 的一样没有变,有顶级的 controllers 来构建,这里指的是构建,但是对于单独的 model 来说,它是被 VM 所持有的,而不是由 VC 持有,view 层的构建和 MVC 差不多,但是和 MVC 中不同的是,VC 不之间为 view 做数据源的获取和准备工作。这个交给了 VM 去做,VC 创建 VM,然后为 view 做数据绑定
  2. Updating the Model
    MVVM 中,VC 接收事件和 MVC 中的一样,当事件到达,VC 不直接改变内部的状态,view state 或者 model,而是调用 VM 的方法,然后通过 VM 改变内部的状态或者 model 的更新
  3. Changing the View
    和 MVC 不同的是,VC 不观察 model 的变化,而是,通过 VM 去观察 model 的变化,然后把 model 的变化转化为某种能被 VC 感知到的方式,VC 订阅 VM 的变化,VM 的事件到达了,VC 就更新 view。view-model 通常会发生 model 更新相关的 view actions 给 model,然后 model 更新后会通知它的观察者
  4. View State
    view state 可以在 view 或者 view-model 中,和 MVC 不同的是,view controller 不含有 view state,当使用 coordinators 的时候,view controller 的 view state 交给它去管理
  5. Testing
    因为 view-model 它和 view 和 controller 比较独立了,所以 VM 方便测试,而不想 MVC 那样,需要集合很多东西一起测试。

Model-View-Controller+ViewState

在 MVC+VS 中引入了一个新的模型 view state model,在 MVC+VS 中不再忽略 navigation 的更改,row 的选择,text field 的编辑,scroll position change 或者其他 view state 的变化。传递相关的 view state model action ,给 view state model,每个 view controller 观察 view state model 的变化,它可以使改变边的直观,无论在是交互逻辑还是呈现逻辑。不在通过 view 来获取 view state 的状态,而是通过 view state model


image.png
  1. Construction
    controller 还是应用 model data 到 view 中,view controller 订阅 view state。
    2.Updating the Model
    当有 view acton 发生的时候,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 被明显的区分出来,controller 观察 document model 和 view state model 的变化来更新 view
  3. Testing
    在 MVC+VS 中测试流程很像 MVC,但是需要设置 document model 和 view state model,困难的部分是集合其他部分,测试 view state.

ModelAdapter-ViewBinder

MAVB 有 3 个重要的组成部分:view binders, model adaptersbindings

view binders 是包装了 view 或者 view controller 的类,它构建 view 和 暴露一系列的绑定,一系绑定是为 view 提供数据,一些事发送事件

model apapter 是包装了一些可变状态,它通过 reducer 来实现,model adpater 提供了输入的绑定(发送事件)和 输出绑定(接收更新)

MAVB 中不用直接创建 view,而是通过 view binders,view binder 和 model adapters 的变化是通过 bindings 来通信

MAVB 移除了 controller 层,构建逻辑通过 view binders,变化逻辑通过 bindings,状态的变化通过 model adapters


image.png
  1. Construction
    model adapter 包装了 main model, view state adpater 包装了 view state,view binders 是通过普通的函数来构成的,它获取 model adapter 的一些参数

  2. Updating the Model
    view 可以发送动作,然后 view binding 允许 action binding,数据流是由 view 到 action binding,输出连接了 model adapter,然后通过 binding 把信息转到 model adapter,最后 MA 通过 reducer 来更新状态

  3. Changing the View
    model apater 的状态改变了,然后发送通知信号给 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 被集合到一个单独的状态模型中,发送的所有改变都通过给这个模型发送消息,然后出来消息的更新状态的函数称为 reducer

TEA 中状态的改变通过创建新的 virtual view hierarchy,它描述了 view 是怎么渲染的,virtual view hierarchy 允许我们通过纯函数去实现,没有副作用。

image.png

  1. Construction
    state 通过 driver 构建。store 是个单例,view 是通过 VVH 来计算当前的状态。

  2. Updating the Model
    Driver 接收到 message 后,使用更新函数来改变状态。

  3. Changing the View
    通过改变状态来改变 view

  4. View State
    VS 也是在 state 中,state 的改变反应到 view 上

  5. Testing
    只需要测试 VVH 它计算的 state 是否真确

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341

推荐阅读更多精彩内容