关于 gof-bridge
介绍 GoF Bridge 模式,面向需要让抽象与实现独立变化的系统设计者。内容涵盖组合、运行时切换,以及 Bridge 与 Adapter 或 Strategy 的区别。
主要功能
- 01分离抽象与实现
- 02采用并行类层次
- 03运行时切换实现
- 04比较 Bridge 与 Adapter
- 05选择依据与常见陷阱
适用场景
- 01支持多种形状与渲染器
- 02让抽象和实现独立演进
- 03按平台或配置选择渲染器
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ yonatankarp/ software-design-skills --skill gof-bridge安装后在 Claude Code 中输入/gof-bridge确认已加载。
详细介绍
一句话概述
将抽象与其实现解耦,使两者可以独立变化——通过沿两个正交维度组合,取代子类数量激增的问题。
何时使用此技能
- 存在两个正交的变化维度:N 种形状 × M 种渲染器,或 N 种绘图工具 × M 种渲染后端。没有 Bridge,就会导致 N×M 个子类激增。
- 你预计抽象(例如
Shape)和实现(例如Renderer)会随时间独立演进,也可能由不同团队维护。 - 你想在运行时切换实现——按平台、环境或配置选择不同的渲染器。
何时不应使用此技能
- 实际上只有一个维度会变化——另一个维度只有一种实现,也看不到第二种实现的需求。使用 Bridge 属于过度设计。
- 所谓的“两个维度”并非真正正交——它们会以迫使彼此耦合的方式相互作用。Bridge 的价值取决于它们是否独立。
- 你是在为两个已有的不兼容接口改造系统——这属于
gof-adapter,而不是 Bridge。Bridge 应在设计之初采用。
核心内容
两个并行的层次结构:
- 抽象——面向客户端的概念(
Shape、RemoteControl、Notification)。持有对 Implementor 的引用。 - Implementor——底层接口(
Renderer、Device、DeliveryChannel)。具体实现类可在运行时接入。
抽象会将具体工作委托给它持有的 Implementor。两个层次结构独立扩展:添加新的 Shape 不需要新增 Renderer 子类,反之亦然。
abstract class Shape(val renderer: Renderer) {
abstract fun draw()
}
interface Renderer { fun renderCircle(x, y, r); fun renderSquare(x, y, s) }
class Circle(renderer: Renderer, val x, y, r): Shape(renderer) {
override fun draw() = renderer.renderCircle(x, y, r)
}
class VectorRenderer: Renderer { ... }
class RasterRenderer: Renderer { ... }
添加新的 Shape(Triangle)时,只需定义它如何通过任何 Renderer 绘制。添加新的 Renderer(SVGRenderer)后,所有现有 Shape 都能免费支持 SVG。
Bridge 与 Adapter 的区别。 两者的组合结构相同,但意图和采用时机不同:
- Adapter 用于改造不兼容的接口——事后应用,通常位于系统边界。
- Bridge 是一种有意的设计选择,用于解耦抽象与实现——在设计之初采用,使两者都能独立变化。
判断准则
- 当两个维度都至少有 2 种变体,且你预计它们都会继续扩展时,Bridge 才有价值。
- 如果只有实现会变化,而抽象固定不变,那么你需要的是
gof-strategy,而不是 Bridge。 - 通过构造函数(或 DI)注入 Implementor,这样无需修改抽象即可替换它。
反模式
- 只有一侧实际会变化时引入 Bridge——一个抽象类加一个子类,再加一个接口和一个实现,纯属形式主义。
- Implementor 泄漏回抽象的 API 中的 Bridge——这会破坏解耦。
- 在抽象的构造函数中硬编码
Implementor的选择——保留了 Bridge 原本要打破的耦合。
另请参阅
gof-adapter— 结构相同的组合方式,用于改造现有的不兼容接口。gof-strategy— 只有一个变化维度(实现)的 Bridge。gof-kotlin-idioms— 在 Kotlin 中,Bridge 通常只是带接口参数的组合,无需抽象类。
参考资料
- Design Patterns(GoF,1994),第 4 章——Bridge。(未收录于 HFDP 第 2 版。)
- Kotlin Design Patterns and Best Practices(Alexey Soshin),第 3 章——Bridge。
评论
支持 Markdown