桥接模式在Go中通过接口组合与结构体嵌入解耦抽象与实现。定义细粒度Implementor接口封装底层行为,抽象层聚合该接口并委托调用,支持双向独立扩展,利用Go隐式接口和组合语法简化实现。

桥接模式的核心是把抽象(Abstraction)和实现(Implementation)解耦,让二者可以独立变化。在 Go 中没有传统面向对象的“继承层级”,但通过接口组合、结构体嵌入和依赖注入,完全可以优雅实现桥接——关键是让抽象层只依赖实现层的接口,而非具体类型。
定义清晰的实现接口(Implementor)
先设计一个稳定、细粒度的接口,封装底层行为。例如绘图系统中,不关心是画在屏幕还是 SVG 文件上:
- 接口应聚焦“做什么”,而非“怎么做”,方法粒度宜小(如
DrawLine,DrawCircle) - 避免暴露平台细节(如 OpenGL 上下文或文件句柄),由具体实现内部处理
- 接口一旦发布,尽量保持向后兼容;扩展用新方法,不修改旧方法签名
构建可插拔的抽象层(Abstraction)
抽象层持有实现接口的字段,所有业务逻辑通过该接口调用。比如图形编辑器的 Shape 不直接绘图,而是委托给 Renderer:
- 用结构体字段聚合实现接口,而非继承(Go 不支持类继承)
- 构造函数接收实现接口作为参数,便于运行时切换(如测试用 MockRenderer)
- 抽象方法内部只做协调逻辑(如计算坐标、组合多个绘制步骤),不碰具体设备细节
按需扩展双向维度
桥接的价值在于两个方向都能独立增补:新增图形类型(抽象扩展)无需改渲染器;新增输出目标(实现扩展)也不影响已有图形逻辑:
立即学习“go语言免费学习笔记(深入)”;
- 加一种新
Shape(如BezierCurve),只需实现其Render(r Renderer)方法,复用全部已有的Renderer - 加一种新
Renderer(如PNGRenderer),只要实现接口方法,所有现有Shape立即可用 - 避免因新增组合(如“圆 + SVG”、“矩形 + OpenGL”)而爆炸式增加结构体
结合 Go 特性简化桥接结构
利用 Go 的隐式接口实现和组合语法,桥接代码更轻量:
- 不必提前声明 “实现了某接口”,只要方法签名匹配,就自动满足
- 用匿名字段嵌入接口,让调用更自然(如
type Shape struct{ Renderer },之后可直接s.DrawLine(...)) - 用函数选项(Functional Options)或配置结构体注入实现,比硬编码 new 更灵活
桥接不是为模式而模式。当发现代码里频繁出现“if renderer == SVG { … } else if renderer == OpenGL { … }”,或每次加一个新功能就要在多个地方改 case 分支,就是桥接该出场的时候了。










