GoLang設計模式18 – 適配器模式

說明

適配器模式是一種結構型設計模式。我們用常用的兩種筆記本電腦來說明一下這種設計模式。

我們常用的筆記本無非是這兩大類:

  1. Macbook Pro
  2. Windows Laptop

當前這兩類筆記本常見的一個區別大概是USB接口的類型了:

  1. Macbook Pro的USB接口現在多為扁圓形的Type-C接口
  2. 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!