常见编程模式


  • 函数式编程 - Functional Programming
  • 响应式编程 - Reactive Programming
  • 函数响应式编程 - Functional Reactive Programming



函数式编程 - Functional Programming

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。我们可以通过组合不同的函数来得到想要的结果

函数式编程是用递归做为控制流程的机制

函数编程典型实例是高阶函数:

详情请参考【阮一峰的日志】函数式编程初探

函数式编程特点:

  • 大量使用函数,减少了代码的重复,代码简洁,开发速度较快
  • 接近自然语言,易于理解
  • 易于”并发编程”

响应式编程 - Reactive Programming

维基百科 - 响应式编程

响应式编程是一种面向数据流和变化传播的编程范式

学习响应式编程最重要的是理解响应式思维

响应式编程就是用异步数据流进行编程

  • 流就是一个按时间顺序正在进行的事件序列(A stream is a sequence of ongoing events ordered in time)
  • 可以基于任何东西创建数据流。流非常轻便,并且无处不在,任何东西都可以是一个流:变量,用户输入,属性,缓存,数据结构等
  • 可以对这些流进行合并、过滤、转变等

例如,在命令式编程环境中

a = b + c

表示将表达式 b + c 的结果赋给 变量 a, 而之后改变 bc 的值不会影响a

但在响应式编程中,a 的值会随着 bc 的值改变而改变


流可以发送 3 种不同的事物:

  • 一个值(Any Type)
  • 一个错误 (Error)
  • 或一个已完成 (Completed) 信号

PS: 在一个流中, Error 和 Completed 只可以发送其中一个

对流的 “监听” 又称为 订阅(Subscribing),而定义的函数即为 观察者(Observer),流就是 主题(Subject, Observable)。这是一个典型的观察者模式。

响应式编程特点:

  • 提高了代码的抽象水平,只需专注那些定义业务逻辑的事件的依存关系,而无需写大量的实现细节
  • 代码会更加简洁
  • 响应式思维, 比较抽象

函数响应式编程 - Functional Reactive Programming

函数响应式编程是 函数式编程响应式编程 的结合

函数响应式编程 = 函数式编程 + 响应式编程

函数响应式编程结合了 FP 和 RP 的特点:

  • 通过不同的构建函数,来创建所需要的数据序列,最后通过适当的方式来响应这个序列
  • 简单点说可以把若干不同数据在不做任何修改的情况下转换成新的数据,一直交替直到符合系统需求的数据

FRP的几种常见事件流处理方法:

  • 映射 (map、 flatMap…)
  • 过滤 (filter…)
  • 合并 (merge、 combine…)
  • 条件 (skip…)

简单代码示例:

getDataFromNetwork()
  .skip(10)
  .take(5)
  .map({ s -> return s + " transformed" })
  .subscribe({ println "onNext => " + it })