scala中借貸模式(Loan Pattern)的使用

定義

在程序編寫中,我們可能經常遇到這樣的情況:

  • 打開某個文件, 統計其中記錄條數, 關閉該文件
  • 打開數據庫, 讀取信息, 關閉數據庫

這種模式都可以歸納爲:

  1. 打開冰箱(獲取某種資源)
  2. 把雞蛋放進去, 把牛奶取出來等等…(操縱資源)
  3. 關閉冰箱 (關閉資源)

對於這種模式, 我們就可以使用”借貸”模式.

借貸模式是一種控制抽象函數(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章