Skip to content
← 返回设计模式列表
设计意图与对象责任

适配器 ​

把旧接口转换为调用方需要的接口。

结构型

说明 ​

包一层转换器即可复用现有实现,避免修改第三方或历史代码。

分析 ​

调用方期待 Reader.Read 返回字符串,而历史对象的 Fetch 返回字节数据。SourceAdapter 保存历史对象,在 Read 中调用 Fetch、传递错误并转换结果。main 通过 Reader 接口使用它,说明旧代码无需改动。

适配分两步:调用旧 Fetch,再将成功结果的字节切片转成字符串;错误原样返回,避免把失败变成空内容的成功。转换不应暗中丢弃编码信息或改变错误可重试性。客户端只依赖 Reader,旧实现被替换时变化集中在适配层。

查看图表代码

适用前提与边界 ​

适配器应专注接口和数据转换,避免混入业务规则。 只有接口适配或独立变化确实存在时,才增加额外包装层。

示例输入与调用 ​

go
var reader Reader = SourceAdapter{Legacy: LegacySource{}}
	value, err := reader.Read()
	fmt.Println(value, err)

运行输出 ​

text
legacy data <nil>

完整 Go 示例 ​

go
package main

import "fmt"

type Reader interface {
	Read() (string, error)
}
type LegacySource struct{}

func (LegacySource) Fetch() ([]byte, error) {
	return []byte("legacy data"), nil
}

type SourceAdapter struct{ Legacy LegacySource }

func (a SourceAdapter) Read() (string, error) {
	raw, err := a.Legacy.Fetch()
	if err != nil {
		return "", err
	}
	return string(raw), nil
}

func main() {
	var reader Reader = SourceAdapter{Legacy: LegacySource{}}
	value, err := reader.Read()
	fmt.Println(value, err)
}

继续阅读