定义
在程序编写中,我们可能经常遇到这样的情况:
- 打开某个文件, 统计其中记录条数, 关闭该文件
- 打开数据库, 读取信息, 关闭数据库
这种模式都可以归纳为:
- 打开冰箱(获取某种资源)
- 把鸡蛋放进去, 把牛奶取出来等等…(操纵资源)
- 关闭冰箱 (关闭资源)
对于这种模式, 我们就可以使用”借贷”模式.
借贷模式是一种控制抽象函数(control-abstraction function), 它试图打开某项资源, 然后将对资源的所有权暂时”借贷”给其他函数, 待其他函数完成操作后, 所有权收回来.
使用这一模式的原因是, 既然资源集中在一个对象中, 那么用户代码就不能一直保持着获得的资源, 而应该在需要时就向资源提供方进行借贷, 用完立即归还. 同时, 这也是一种对系统资源操作的封装, 为了防止资源不被安全释放(close), 其次用户代码不用考虑资源来自何处, 以及如何归还, 只要用就行.
此外, scala 中函数也是对象, 可以向参数那样传递给另一个函数的特征使得贷出模式更有意义. 客户代码借贷了所需的资源. 接下来如何使用这些资源以完成特定的任务则由客户决定. 就像我们向银行贷款,这些钱的具体用途是客户决定,也是客户才明确的.
代码实例
def writeFile(fileName: File)(operation: PrintWriter => Unit) {
val writer = new PrintWriter(fileName) // 贷出资源writer
try{
operation(writer) // 客户使用资源
}finally {
writer.close() // 用完则释放被回收
}
}
writeFile 函数的定义用到了柯里化方法, 后面的参数operation用于传入客户具体想要的操作(即怎么使用资源)
客户调用如下:
val file = new File("test.txt")
writeFile(file) {
// 使用资源的具体操作
writer => writer.println("你好啊 ...\r\n" +
new java.util.Date())
}
执行该脚本,会发现在当前目录下生成一个 test.txt 文件, 文件内容即”你好啊…和时间”
参考资料:
1. Scala:初识贷出模式(Loan Pettern)
http://haolloyin.blog.51cto.com/1177454/387138/
2. 如何理解Scala中的借贷模式(loan pattern)?
https://www.zhihu.com/question/33403476