结构型设计模式——适配器模式

文章目录

适配器(Adapter)模式是一种结构型设计模式。我们用常用的两种笔记本电脑来说明一下这种设计模式。

我们常用的笔记本无非是这两大类:

  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盘),也想用这个已经封装好的类提供的功能。此时该怎么做?

这时就可以应用适配器模式了。适配器模式说白了就是兼容。它就像一个接口转换器,调用方只需要调用这个适配器接口,而不需要关注其背后的实现,由适配器接口封装复杂的过程。

代码示例

假设有 windowsmac 两个实例。我们将这两个类看作是那个已经封装严谨的类,我们需要提供一个适配器接口,使调用方在插入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()

}

运行该示例代码

参考文章:


也可以看看


全国大流量卡免费领

19元月租ㆍ超值优惠ㆍ长期套餐ㆍ免费包邮ㆍ官方正品