适配器
把旧接口转换为调用方需要的接口。
结构型
说明
包一层转换器即可复用现有实现,避免修改第三方或历史代码。
分析
调用方期待 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)
}继续阅读
- 设计意图与对象责任
- 设计意图与对象责任
- 设计意图与对象责任