說明
擴充卡模式是一種結構型設計模式。我們用常用的兩種筆記本電腦來說明一下這種設計模式。
我們常用的筆記本無非是這兩大類:
- 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!
僅是學習筆記,難免出錯,望不吝指點