桥接模式
Bridge — 把抽象和实现分离,让它们可以独立变化
一句话理解
当一个事物有两个独立变化的维度时,用组合代替继承,让两个维度各自扩展,互不影响。
解决什么问题
假设要画不同颜色的不同形状:红色圆形、蓝色圆形、红色方形、蓝色方形……如果用继承,类的数量 = 颜色数 × 形状数,组合爆炸。
桥接模式把"形状"和"颜色"拆成两个独立的维度,通过组合连接。
怎么写
// 维度 1:颜色(实现方)
public interface Color {
String fill();
}
public class Red implements Color {
public String fill() { return "红色"; }
}
public class Blue implements Color {
public String fill() { return "蓝色"; }
}
// 维度 2:形状(抽象方)—— 持有颜色的引用
public abstract class Shape {
protected Color color; // 桥接到颜色
public Shape(Color color) { this.color = color; }
public abstract void draw();
}
public class Circle extends Shape {
public Circle(Color color) { super(color); }
public void draw() {
System.out.println("画一个" + color.fill() + "的圆形");
}
}
public class Square extends Shape {
public Square(Color color) { super(color); }
public void draw() {
System.out.println("画一个" + color.fill() + "的方形");
}
}// 使用:两个维度自由组合
new Circle(new Red()).draw(); // 画一个红色的圆形
new Square(new Blue()).draw(); // 画一个蓝色的方形新增颜色或新增形状,都只需要加一个类,不会影响另一个维度。
使用场景
- JDBC ——
DriverManager(抽象)和具体数据库驱动(实现)分离 - 跨平台消息推送 —— 消息类型(普通/紧急)× 推送渠道(短信/邮件/App)
- 日志系统 —— 日志级别 × 输出目标(控制台/文件/远程)