Agera官方Wiki翻译(二)——响应式编程

Agera 是一种响应式编程范式,它背后的驱动机制是著名的观察者模式。被观察者(observable)使用接口 Observable 来表示,它负责向所有注册过的观察者(observers)广播事件。观察者(observers)使用接口 Updatable 来表示,可以被注册到 Observable 上,也可以从它上面取消注册,当事件到来的时候进行更新操作,Updatable 即因此得名。

本 wiki 的剩下部分中,讲 observableupdatable 作为名词概念来使用,分别表示 Java 中实现了这两个接口的对象。

传事件、拿数据

Agera 使用了一种传事件、拿数据(push event, pull data)的模型。这意味着事件不带任何数据,而由 updatable 来负责在自己更新过程必要时,从数据源中拿去数据。

这样,提供数据的义务从 Observable 接口中被移除了,允许它封装封装简单的事件,诸如按钮点击、下拉刷新出发、一个重新同步的信号(例如发来应用到 GCM 消息),等等。

可是,observables 一般也提供数据。一个既提供数据且定义事件来改变所提供数据的 observable 被称为Repository)。这并没有改变传事件、拿数据这一模型:源提醒所注册的 updatables 当数据变化的时候更新它们自己;各个 updatables 会独自响应事件,从源拿去数据。这个模型的一大好处是将数据消费从事件分发中分离出来,使得源可以进行懒惰计算(lazy calculation)。

由于传事件、拿数据模型和通常的多线程处理,updatable 可能看不到源数据完整的改变历史。这是故意这么设计的:大多数情况下(特别是更新更新应用 UI),只关心最新的数据。

一个标准的按照 Agera 风格实现的响应式客户端应该包含下列:

  • 将 updatable 注册到合适的 observables 上,后者会通知相关事件
  • 可以可选地触发 updatable 来初始化,或者更正程序状态
  • 等待 updatable 被 observable 触发,一旦触发,就用从数据源拿来的新数据更新程序状态。
  • 当不再需要响应的时候,将 updatable 从它已注册过的 observables 上面取消注册。