适配器模式通过接口转换解决不兼容问题。Go语言中虽无继承,但可用结构体嵌入模拟类适配器,如WechatAdapter嵌入WechatPay并实现统一Pay方法;更推荐的是对象适配器,通过组合持有被适配对象,如WechatObjectAdapter封装WechatPay实例,实现解耦与灵活依赖注入。该模式适用于统一日志库、封装外部API等场景,核心在于定义目标接口并通过适配包装原有组件,对象适配因支持运行时注入、易于测试且符合“组合优于继承”原则而成为首选方案。

适配器模式用于解决接口不兼容的问题,让原本无法协作的类能够一起工作。在 Go 语言中,由于不支持继承,类适配器的实现方式受限,但通过组合(对象适配)可以很好地实现适配逻辑。下面分别介绍类适配与对象适配在 Golang 中的实践方式。
Go 不支持传统意义上的类继承,但可以通过结构体嵌入(embedding)来模拟“is-a”关系,从而实现类似类适配器的效果。
假设有一个旧的支付接口,只支持支付宝,现在需要接入微信支付,但系统期望统一调用 Pay 方法:
type Alipay struct{}
func (a *Alipay) Pay() string {
return "支付宝支付"
}
// 微信支付(不兼容接口)
type WechatPay struct{}
func (w *WechatPay) WechatPay() string {
return "微信支付"
}
// 类适配器:嵌入 WechatPay 并实现统一接口
type WechatAdapter struct {
WechatPay // 嵌入实现“继承”
}
func (w *WechatAdapter) Pay() string {
return w.WechatPay.WechatPay()
}
使用时,WechatAdapter 看起来就像一个标准的支付组件:
立即学习“go语言免费学习笔记(深入)”;
func main() {
payers := []Payer{
&Alipay{},
&WechatAdapter{WechatPay{}},
}
for _, p := range payers {
fmt.Println(p.Pay())
}
}
这种方式利用结构体嵌入提升复用性,外观上接近类适配器。
更符合 Go 风格的是对象适配器,它依赖组合而非嵌入,适配器持有被适配对象的实例,完全解耦。
type Payer interface {
Pay() string
}
// 对象适配器
type WechatObjectAdapter struct {
wechat *WechatPay
}
func (w *WechatObjectAdapter) Pay() string {
return w.wechat.WechatPay()
}
func NewWechatAdapter(wechat *WechatPay) *WechatObjectAdapter {
return &WechatObjectAdapter{wechat: wechat}
}
调用方式:
adapter := NewWechatAdapter(&WechatPay{})
fmt.Println(adapter.Pay()) // 输出:微信支付
对象适配器的优势在于灵活,可以在运行时注入依赖,便于测试和替换。
在 Go 中推荐优先使用对象适配器,原因如下:
例如,在日志系统中,将不同格式的日志库(如 zap、logrus)统一为同一接口,或在微服务中将外部 API 封装为内部标准调用。
基本上就这些。Golang 虽无继承,但通过接口和组合能更简洁地实现适配器模式,关键是定义好目标接口,再包装不兼容的组件。对象适配是更自然、更推荐的方式。
以上就是Golang适配器模式类适配与对象适配实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号