GoLang設計模式18 – 適配器模式
說明
適配器模式是一種結構型設計模式。我們用常用的兩種筆記型電腦電腦來說明一下這種設計模式。
我們常用的筆記型電腦無非是這兩大類:
- Macbook Pro
- Windows Laptop
當前這兩類筆記型電腦常見的一個區別大概是USB介面的類型了:
- Macbook Pro的USB介面現在多為扁圓形的Type-C介面
- Windows筆記型電腦的USB介面則多為方形的Type-A介面
現在我手上有一個Type-C扁圓口的U盤,但是我用的筆記型電腦Windows,這該怎麼辦呢?
這也是編程時常遇到的一種問題:
我們有一個已經封裝嚴謹的類(如Windows筆記型電腦),它提供了一些功能並指定對接參數的類型(如Type-A方形USB介面)。但是現在有一個不同類型的實例(Type-C扁圓形口U盤),也想用這個已經封裝好的類提供的功能。此時該怎麼做?
這時就可以應用適配器模式了。我們創建一個Adapter類,他可以提供如下功能:
- 按照已有類指定的參數類型進行實現
- 轉譯調用方的請求
在我們前面的例子中,這個Adapter就可以是一個轉接器,它接收Type-C扁圓形介面的輸入,提供Type-A方形介面的數據輸出,從而能讓我們順利地使用上手頭的方口U盤。
UML類圖
看下類圖:

然後是前面舉的例子的類圖:

程式碼
示例程式碼如下:
computer.go
type computer interface {
insertInSquarePort()
}
mac.go
type mac struct {
}
func (m *mac) insertInSquarePort() {
fmt.Println("Insert square port into mac machine")
}
windows.go
type windows struct{}
func (w *windows) insertInCirclePort() {
fmt.Println("Insert circle port into windows machine")
}
windowsAdapter.go
type windowsAdapter struct {
windowMachine *windows
}
func (w *windowsAdapter) insertInSquarePort() {
w.windowMachine.insertInCirclePort()
}
輸出內容:
Insert square port into mac machine Insert circle port into windows machine
程式碼已上傳至GitHub: zhyea / go-patterns / adapter-pattern
END!


