桥接模式在Go中通过接口组合与结构体嵌入实现抽象层与实现层解耦。抽象结构体持有一个实现层接口字段,运行时可自由替换具体实现,支持两套独立演化的类族组合扩展。

桥接模式的核心是把“抽象”和“实现”两个维度拆开,让它们可以独立变化。在 Go 里没有传统面向对象的继承层级,但通过接口组合 + 结构体嵌入,能更轻量、更清晰地实现桥接。
定义抽象层与实现层接口
先分离关注点:抽象层(比如图形、消息、支付)只依赖实现层接口,不关心具体怎么执行。
- 实现层接口(Implementor)定义基础能力,如
Draw()、Send()、Charge() - 抽象层接口(Abstraction)持有实现层接口字段,封装高层逻辑,如
Render()、Notify()
用结构体嵌入组装桥接关系
Go 不靠继承,而是让抽象结构体「包含」实现接口字段。这样运行时可自由替换实现,彻底解耦。
- 定义一个抽象结构体(如
ImageRenderer),内嵌Drawer接口字段 - 构造时传入任意满足
Drawer的实例(如VectorDrawer或RasterDrawer) -
Render()方法内部调用r.drawer.Draw()—— 具体行为由注入的实现决定
避免常见误区:别把桥接写成策略或装饰
桥接不是选一种算法(那是策略模式),也不是动态加行为(那是装饰器)。它的关键是「两套可独立演化的类族」。
立即学习“go语言免费学习笔记(深入)”;
- 比如:图形类型(PNG、SVG、PDF) × 渲染方式(OpenGL、Canvas、Terminal)→ 共 3×3=9 种组合,桥接后只需 3+3=6 个类型
- 如果所有实现都塞进一个结构体里用 switch 判断,就失去了桥接意义
- 如果每次调用都重新传入实现,没保存到结构体字段中,那就只是临时委托,不是桥接
实际小例子:跨平台日志输出
抽象层是 Logger(支持 Info()、Error()),实现层是 Output(支持 Write([]byte))。你可以让 ConsoleLogger 和 FileLogger 共享同一套 JSONOutput 或 PlainOutput,互不影响扩展。
基本上就这些。桥接在 Go 里不复杂,但容易忽略——只要记住:抽象结构体持有一个接口字段,并把它作为行为代理出口,就立住了。










