真實世界的 Go 設計模式 - 適配器模式

在設計模式中,適配器模式(adapter pattern)有時候也稱包裝模式或者包裝(英語:wrapper)。將一個類的接口轉接成用戶所期待的。一個適配使得因接口不兼容而不能在一起工作的類能在一起工作,做法是將類自己的接口包裹在一個已存在的類中。

這個模式很容易記住,每次看到它我就想起世界各地各種不同的電源插頭標準,五花八門,但是你拿一個筆記本到處出差的話,怎麼辦呢?總不能拿十幾個插頭吧,所以有一種叫做插頭轉換器的東西,支持各種插頭標準,它就是適配器。

中國絕大部分的鐵路都採用的是標準軌標準,中亞那邊的鐵路採用的是窄軌標準,但是國際聯運列車——中歐班列到了霍爾果斯口岸,就要將火車的底盤更換,這也是進行適配的模式。

Go 標準庫中的 bufio 包中的BufioReaderBufioWriter結構體分別實現了ReaderWriter接口, 同時還提供了 buffer 的功能,可以有效減少讀取次數來提高 IO 效率。一個 bufio.Reader 的簡單使用示例如下:

// 創建一個buffer大小爲1024字節的bufio.Reader
reader := bufio.NewReaderSize(file, 1024)

// 使用Read方法讀取,會使用緩衝區減少讀取次數
bytes, err := reader.Read(buffer)

// 使用Peek方法獲取緩衝區的第一個字節
b, _ := reader.Peek(1)

// 使用Discard方法跳過n個字節
reader.Discard(100)

// 讀取時可以根據需要設置最大大小
line, prefix, err := reader.ReadLine()

bufio.Reader 常用於對文件、網絡連接等進行 IO 操作, 實現緩衝讀取。

主要的優點是減少實際的讀取操作次數, 提高效率。並可以根據需要自定義緩衝區大小。而且如上面的例子,它還提供了 Peek、Discard 甚至按行讀取。相比直接從文件或連接讀取, bufio.Reader 對於提高 IO 性能非常有幫助。

bufio包中還有這個設計模式的例子,比如func NewScanner(r io.Reader) *Scanner 實現了掃描的功能。

它們通過將通用的 ip.Reader,轉換成帶緩存功能的 Reader、帶掃描功能的 Scanner,爲新的功能提供適配的能力 (緩存適配、掃描適配)。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/KYlY-WFNpYirvcRiyaeVXw