适配器模式与桥接模式可组合使用:适配器解决接口不兼容,桥接解耦抽象与实现;Go通过接口组合、结构体嵌入和函数字段自然支持该协作,如Logger抽象层与LogWriter实现层分离,并用StdLoggerAdapter适配旧日志函数。

适配器模式和桥接模式可以组合使用,解决“接口不兼容”与“实现紧耦合”两个问题:适配器负责对接已有接口,桥接负责解耦抽象与实现。Golang 没有继承多态,但通过接口组合、结构体嵌入和函数字段,能自然表达这两种模式的协作逻辑。
定义统一抽象层(桥接的抽象部分)
先设计一个高层业务接口,它不关心底层如何实现,只声明行为契约:
例如日志记录器抽象:
type Logger interface {Log(level string, msg string)
}
这个接口是桥接模式中的“抽象(Abstraction)”,后续可被不同业务模块依赖,而无需绑定具体实现。
立即学习“go语言免费学习笔记(深入)”;
分离实现细节(桥接的实现部分)
将具体输出方式(文件、网络、控制台)抽为独立类型,实现同一接口或提供可桥接的函数:
- 定义实现者接口(可选,增强扩展性):type LogWriter interface { Write(msg string) error }
- 实现具体写入器:FileWriter、HTTPWriter、ConsoleWriter
- 桥接核心:在 Logger 实现中持有 LogWriter,运行时注入
这样抽象(Logger)和实现(LogWriter)完全解耦,可独立变化。
用适配器对接不兼容的旧系统
当第三方库提供的是 func(string) 或带额外参数的函数(如 log.Printf),无法直接满足 Logger.Log 接口时,就需适配器:
- 创建结构体封装旧函数:type StdLoggerAdapter struct { logFunc func(string, ...interface{}) }
- 实现 Logger 接口:func (a *StdLoggerAdapter) Log(level, msg string) { a.logFunc("[%s] %s", level, msg) }
- 该适配器可作为桥接中的具体实现被注入到桥接类中
组合使用:桥接类内嵌适配器实例
最终的桥接实现类(如 BridgeLogger)不直接调用 fmt.Println,而是持有一个 Logger 接口字段:
type BridgeLogger struct {writer Logger // 可注入 StdLoggerAdapter、FileLogger 等任意符合接口的实例
}
func (b *BridgeLogger) Log(level, msg string) {
b.writer.Log(level, msg)
}
此时,适配器让旧代码“能进桥接”,桥接让新架构“可换实现”。两者配合,既兼容又灵活。










