结构型 中等

桥接模式

Bridge Pattern

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

概述

桥接模式是一种结构型设计模式,它将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构。通过这种方式,你可以在抽象和实现两个维度上独立地进行扩展,而不需要修改现有的代码。

适用场景

  • 当需要拆分或重组一个具有多重功能的庞杂类时(例如,需要与多个数据库服务器交互的类)
  • 当需要在几个独立维度上扩展一个类时,使用桥接模式可以避免创建大量的子类
  • 当希望在运行时切换不同的实现方式时
  • 当需要隐藏平台相关的实现细节时

优点

  • +可以创建与平台无关的类和程序
  • +客户端代码仅与高层抽象部分交互,不接触实现细节
  • +开闭原则:可以独立地扩展抽象和实现,无需修改现有代码
  • +单一职责原则:抽象专注于高层控制逻辑,实现处理平台相关细节

缺点

  • 对高内聚的类使用该模式可能会让代码更加复杂
  • 需要正确地识别和分离抽象与实现两个维度
  • 增加了类的数量和代码复杂度

结构

classDiagram class Abstraction { -implementation: Implementation +operation() } class RefinedAbstraction { +operation() +additionalOperation() } class Implementation { <<interface>> +operationImpl() } class ConcreteImplementationA { +operationImpl() } class ConcreteImplementationB { +operationImpl() } class Client { +main() } Abstraction o--> Implementation : contains RefinedAbstraction --|> Abstraction : extends ConcreteImplementationA ..|> Implementation : implements ConcreteImplementationB ..|> Implementation : implements Client ..> Abstraction : uses style Abstraction fill:#e3f2fd,stroke:#1976d2,stroke-width:2px style RefinedAbstraction fill:#e8f5e9,stroke:#388e3c,stroke-width:2px style Implementation fill:#fff3e0,stroke:#f57c00,stroke-width:2px style ConcreteImplementationA fill:#fce4ec,stroke:#c2185b,stroke-width:1px style ConcreteImplementationB fill:#fce4ec,stroke:#c2185b,stroke-width:1px style Client fill:#f5f5f5,stroke:#616161,stroke-width:1px

交互演示

分离抽象与实现,独立变化
Abstraction
bridge
Implementation
组合结果选择组合...

分别从左右两侧选择抽象和实现进行组合

生活类比

桥接模式就像是遥控器和电视之间的关系

遥控器与电视

遥控器(抽象)可以与不同品牌的电视(实现)配对,两者可以独立变化。你可以更换遥控器而不影响电视,也可以更换电视而继续使用同一个遥控器。

形状与颜色

绘制图形时,形状(抽象)和颜色(实现)是两个独立维度。使用桥接模式,你可以独立地添加新形状或新颜色,而不需要为每种组合创建子类。

设备与音乐播放器

音乐播放器应用(抽象)可以在不同设备(实现:手机、电脑、智能音箱)上运行。应用和设备可以独立升级和扩展。

代码实现

Example.java

实际应用

Java AWT/Swing

Java AWT 使用桥接模式将组件(抽象)与平台特定的实现(实现)分离。Component 类是抽象,而 ComponentPeer 接口是实现。

Example.java

JDBC 数据库访问

JDBC 是桥接模式的经典应用。DriverManager 提供统一接口(抽象),而各个数据库厂商提供具体的 Driver 实现。

Example.java

跨平台 GUI 框架

Electron、React Native 等框架使用桥接模式分离业务逻辑与原生平台实现,实现一次编写,多端运行。

Example.java

练习

1

桥接模式的主要目的是什么?

2

桥接模式使用组合关系而非继承来连接抽象和实现

3

以下哪个场景最适合使用桥接模式?

4

桥接模式与适配器模式的区别是什么?