在Go语言项目中,第三方接口的数据结构和我们内部定义通常不一样,如果直接在业务代码里调用,后期更换服务商或接口升级都会很麻烦。适配器模式通过增加一层包装,让外部接口看起来像本地服务,从而保持业务层稳定。

什么是适配器模式
适配器模式属于结构型设计模式,核心是把一个类的接口转换成客户希望的另一个接口。Golang没有继承,但可以用接口(interface)配合结构体嵌套来实现。
场景示例
假设内部业务依赖一个UserProvider接口,但第三方返回的是另一种格式。我们定义一个适配器来转换。
内部接口定义
package main
// 内部期望的用户接口
type UserProvider interface {
GetUserName(id int) (string, error)
}
// 内部用户结构
type InnerUser struct {
ID int
Name string
}
第三方接口与适配器
第三方SDK提供了ThirdUserAPI,返回字段是Uid和FullName,我们写适配器兼容。
package main
import "fmt"
// 第三方用户API(模拟)
type ThirdUserAPI struct{}
// 第三方返回结构
type ThirdUser struct {
Uid int
FullName string
}
// 第三方方法
func (t *ThirdUserAPI) FetchUser(uid int) (*ThirdUser, error) {
// 模拟调用
return &ThirdUser{Uid: uid, FullName: "张三"}, nil
}
// 适配器结构体
type UserAdapter struct {
api *ThirdUserAPI
}
// 实现内部UserProvider接口
func (a *UserAdapter) GetUserName(id int) (string, error) {
tu, err := a.api.FetchUser(id)
if err != nil {
return "", err
}
// 字段映射转换
return tu.FullName, nil
}
func main() {
var provider UserProvider = &UserAdapter{api: &ThirdUserAPI{}}
name, err := provider.GetUserName(1)
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Println("用户名:", name)
}
适配器的优势
- 业务代码只依赖
UserProvider接口,不感知第三方细节 - 更换第三方时只需新写适配器,主逻辑不动
- 方便做单元测试,可用假适配器代替真实API
使用建议
当第三方接口数量多且变动频繁,可以为每组接口建独立适配器包。若只是偶尔调用,简单封装函数也可,不一定非用完整适配器结构。
注意:适配器内部要做必要的错误处理和字段校验,避免第三方空数据导致系统异常。