跳到主要内容

桥接模式

桥接模式将类的抽象部分与其实现部分分离,使它们可以独立变化。这种模式有助于解决多维度变化的问题。

示例

这听起来比较让人难以理解,但实际上桥接模式的概念非常简单,很可能你在开发过程中已经不知不觉地使用过它。

例如,我们之前一直使用门的例子来解释设计模式。我们通常会有 Door, IronDoor, WoodenDoor 这几个类,但如果再引入 Color 的概念,那么就会有 RedIronDoor, BlueIronDoor, RedWoodenDoor, BlueWoodenDoor 等多个类——很明显,类的数量将随属性的增加而呈指数级增长。

为了避免这种情况,我们会将继承关系改为组合关系,即将 Color 作为一个属性,而不是一个类;对于 Material 也是一样。这样,我们就可以通过组合不同的对象来实现不同颜色和材质的门,而不需要为每种属性都创建一个新的类。

结构

桥�接模式示意图桥接模式示意图

客户端直接与抽象类交互,抽象类则与实现类交互。抽象类则封装了实现类的接口和属性,使得客户端可以通过抽象类来访问实现类。

备注

某种程度上,这也像是遥控器和电视机的关系。遥控器是抽象类,电视机是实现类,遥控器通过按钮来控制电视机。

应用场景

  • 当希望在几个独立维度上变化一个类时
  • 当需要在运行时切换不同实现时

优缺点

优点

  • 客户端代码仅与高层抽象部分进行互动,对具体实现不了解
  • 单一职责原则:抽象部分专注于处理高层逻辑,实现部分处理平台细节。
  • 开闭原则:可以新增抽象部分和实现部分,且它们之间不会相互影响。

缺点

  • 抽象部分和实现部分分离,增加了代码复杂度,尤其是高内聚的系统

代码示例

下面是一个使用桥接模式的 Python 示例。在这个例子中,RemoteControl(遥控器)是抽象部分,它提供了控制设备的基本接口。Device(设备)是实现部分,定义了所有具体设备(如 TVRadio)必须实现的接口。

RemoteControl 类持有一个 Device 对象的引用,并将所有实际工作委托给这个对象。这样,我们可以独立地扩展遥控器(例如,创建一个 AdvancedRemoteControl)和设备(例如,添加一个新的 DVDPlayer 类),而不会导致类爆炸。客户端代码可以根据需要将任何遥控器与任何设备组合使用。