定義
在程序編寫中,我們可能經常遇到這樣的情況:
- 打開某個文件, 統計其中記錄條數, 關閉該文件
- 打開數據庫, 讀取信息, 關閉數據庫
這種模式都可以歸納爲:
- 打開冰箱(獲取某種資源)
- 把雞蛋放進去, 把牛奶取出來等等…(操縱資源)
- 關閉冰箱 (關閉資源)
對於這種模式, 我們就可以使用”借貸”模式.
借貸模式是一種控制抽象函數(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