适配器(Adapter)模式是一种结构型设计模式。我们用常用的两种笔记本电脑来说明一下这种设计模式。
我们常用的笔记本无非是这两大类:
- 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盘),也想用这个已经封装好的类提供的功能。此时该怎么做?
这时就可以应用适配器模式了。适配器模式说白了就是兼容。它就像一个接口转换器,调用方只需要调用这个适配器接口,而不需要关注其背后的实现,由适配器接口封装复杂的过程。
代码示例
假设有 windows
和 mac
两个实例。我们将这两个类看作是那个已经封装严谨的类,我们需要提供一个适配器接口,使调用方在插入USB时不需要再操心到底是需要Type-C还是Type-A,直接由适配器做好兼容。
package main
import "fmt"
type computer interface {
insertUSB()
}
type mac struct {
}
func (m *mac) insertUSB() {
fmt.Println("Insert usb into mac machine")
}
type windows struct{}
func (w *windows) insertUSB() {
fmt.Println("Insert usb into windows machine")
}
type USBAdapter struct {
windowMachine *windows
macMachine *mac
}
func (p *USBAdapter) insertUSB() {
if p.windowMachine != nil {
p.windowMachine.insertUSB()
} else if (p.macMachine) != nil {
p.macMachine.insertUSB()
}
}
func NewUSBAdapter(c computer) *USBAdapter {
switch machine := c.(type) {
case *mac:
return &USBAdapter{macMachine: machine}
case *windows:
return &USBAdapter{windowMachine: machine}
}
return nil
}
func main() {
// 当我的电脑是mac时
mac := &mac{}
adapter := NewUSBAdapter(mac)
// 我不用管usb接口类型,我直接插入
adapter.insertUSB()
// 当我的电脑是windows时
windows := &windows{}
adapter = NewUSBAdapter(windows)
// 我不用管usb接口类型,我直接插入
adapter.insertUSB()
}
参考文章: