设计模式-桥接模式(Bridge Pattern)
设计模式-桥接模式(Bridge Pattern)
概要
记忆关键词:抽象和实现分离。
定义:将抽象部分与它的实现部分分离,使它们都可以独立变化。
分析:一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。
类型:结构型
桥接模式结构图如下

一、涉及相关角色
1. 抽象部分
系统对外提供的高层接口,代表抽象的业务维度。
说明:在下面示例中,形状(Shape)是抽象部分,它定义了一个绘制形状的接口,比如 draw() 方法,但不关心具体颜色如何实现。
2. 扩充抽象部分
在抽象部分的基础上,增加额外的功能或具体行为。
说明:在下面示例中,圆形(Circle)、正方形(Square)等具体形状类,它们在 draw() 方法中调用颜色的实现。
3. 实现部分
描述抽象部分所依赖的操作接口,是另一个独立变化的维度。被抽象部分组合,完成具体实现。抽象部分通过该接口与实现部分解耦,而不是依赖具体实现。
说明:在下面示例中,颜色(Color)就是实现部分,比如红色、蓝色,它只定义颜色的行为接口
4. 具体实现部分
实现部分接口的具体类,完成实际的业务逻辑。
说明:在下面示例中颜色(Color)具体实现类有白色、灰色、黑色,它们都实现了颜色接口,完成实际业务逻辑。
二、示例代码
1. 实现部分
1 public interface Color { 2 void paint(String shape); 3 } 4 public class Black implements Color { 5 @Override 6 public void paint(String shape) { 7 System.out.println("黑色的" + shape); 8 } 9 } 10 public class White implements Color { 11 @Override 12 public void paint(String shape) { 13 System.out.println("白色的" + shape); 14 } 15 } 16 public class Gray implements Color { 17 @Override 18 public void paint(String shape) { 19 System.out.println("灰色的" + shape); 20 } 21 }
2. 抽象部分
public abstract class Shape { Color color; // 桥接到实现部分 public void setColor(Color color) { this.color = color; } public abstract void draw(); } public class Rectangle extends Shape{ @Override public void draw() { color.paint("长方形"); } } public class Square extends Shape { @Override public void draw() { color.paint("正方形"); } } public class Circle extends Shape{ @Override public void draw() { color.paint("圆形"); } }
三、优缺点分析
1. 优点
- 抽象与实现分离:将抽象部分和实现部分分离,减少它们之间的耦合,使系统更灵活。
- 提高系统扩展性:抽象和实现可以沿着不同的维度独立扩展,不会相互影响。
- 符合开闭原则:新增抽象类或实现类时无需修改现有代码,扩展更容易。
- 运行时动态组合:抽象和实现可以在运行时动态绑定,而不是编译期固定。
- 减少子类数量:相比多维度继承的方式,桥接模式用组合替代继承,避免类爆炸。
2. 缺点
- 增加系统复杂度:引入桥接层,增加了类的数量和代码复杂度,对初学者理解不直观。
- 设计难度较高: 需要在系统设计阶段明确抽象维度,提前规划,否则后续改造成本大。
- 过度设计风险如果系统只有一个维度变化,使用桥接模式会显得多此一举。
四、适用场景
JDBC 驱动是桥接模式的经典应用。如果我们想要把 MySQL 数据库切换成 Oracle 数据库,只需要更换数据库驱动,动一行代码就可以实现了
支付系统 → 支付方式(实现部分) + 支付渠道(抽象部分)
日志系统 → 日志级别(抽象部分) + 输出方式(实现部分)

浙公网安备 33010602011771号