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!