结构型 适配器模式

为什么需要适配器模式

一般来说如果老的实现类无法满足当前使用需求,但是我们又不敢修改老的业务类,或者业务类根本就是imported的或者外部来的,这个时候我们可以adaptor这种设计模式来修改类,让实现后的适配器类满足我们的需求。例如Macbook pro只提供了type c的接口,但是我们的设备只能usb的接口,这个时候我们就需要一个转换接口,这个接口就是我们要实现的适配器类。

我个人的理解是适配器是应该尽量被避免的,因为这个增加了维护的成本,只能用于紧急或者无可奈何的情况下再使用。

实现

一般来说我们实现的adapter采用匿名包含需要被适配的类或者接口(如果来源于外部函数,很可能只有接口)。

go.mod

module adapter

go 1.13

adapter.go

package adapter

type Target interface {
	DesiredFunc() (string, error)
}

// Adaptee wants to convert Adaptee to our target
type Adapter struct {
	Adaptee
}

func NewAdapter(a Adaptee) *Adapter {
	return &Adapter{
		Adaptee: a,
	}
}

func (a *Adapter) DesiredFunc() (string, error) {
	// we can access CustomizedFunc because of anoymous composite.
	return a.CustomizedFunc(), nil
}

// Adaptee is from external source
type Adaptee interface {
	CustomizedFunc() string
}

func NewAdaptee() Adaptee {
	return &adapteeImpl{}
}

type adapteeImpl struct{}

func (a *adapteeImpl) CustomizedFunc() string {
	return "customized"
}

adapter_test.go

package adapter_test

import (
	"adapter"
	"testing"
)

func TestAdapter(t *testing.T) {
	adapterObj := adapter.NewAdapter(adapter.NewAdaptee())
	output, err := adapterObj.DesiredFunc()
	if err != nil || output != "customized" {
		t.Fatal("Adapter is implemented incorrectly")
	}
}

执行: go test adapter -v

Previous
Next