天天看點

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類圖

看下類圖:

GoLang設計模式18 - 擴充卡模式

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

GoLang設計模式18 - 擴充卡模式

代碼

示例代碼如下:

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!

僅是學習筆記,難免出錯,望不吝指點