Scala设计模式:借贷模式(Loan Pattern)

借贷模式(Loan Pattern)正如其名,就是把一个“资源”借出去给别人用,而自己负责资源的回收。python中的with语句就是这个模式的一个实现。Scala中虽然没有直接提供with语句,但借助其完善的类型系统和对函数式的支持,我们可以自己实现一个。

借贷模式有什么用?

使用“资源”时,比如Flie、Stream等,一定要记得在用完时close它们。使用借贷模式的一大好处就是,对于使用者不用再关心close资源这件事了,模式会自动帮你把他们关掉。

借贷模式怎么做?

利用Scala中的结构类型,可以实现“借贷模式”(完整代码可以看这里):

object using {
  def apply[R <: {def close() : Unit}, T](resource: => R)(f: R => T): T = {
    val source = Option(resource)
    try {
      f(source.get)
    } finally {
      for (s <- source)
        s.close()
    }
  }
}

使用方法示例如下:

using(new File()) { file =>
  println(file.getName)
}

附:结构类型(Structural Types)

[R <: {def close() : Unit}, T]

这段代码中的{def close() : Unit}实际上就是定义了一个结构类型。结构类型是Scala强大类型系统中,可以实现类似“动态类型”效果的一个魔法。

鸭子测试:
如果一个对象看起来像鸭子,游泳像鸭子,叫声像鸭子,那么它可能就是只鸭子。我们就可以暂时把这个对象当做鸭子来用。

如上的定义中,只要类中有一个返回Unitclose()方法,都被认为是这个结构类型的子类,都满足R <: {def close() : Unit}这个约束。这样,我们定义的这个using()就可以支持各种各样资源的类型,只要它有close()方法。

你可能感兴趣的:(Scala设计模式:借贷模式(Loan Pattern))