桥接模式 (Bridge Pattern)
桥接模式是一种 结构型设计模式,用于将抽象部分与实现部分分离,使它们可以独立变化。它通过组合的方式取代继承,将不同维度的变化解耦,从而提高系统的灵活性。
原理
- 核心思想:将一个对象的 抽象部分 和 实现部分 分离开,分别独立定义和扩展。
- 适用场景:
- 当一个类有多个维度的变化,需要独立扩展时。
- 避免因为多维度的变化导致类的数量爆炸。
- 不希望使用继承方式来扩展时。
- 参与角色:
- Abstraction(抽象类):定义高层抽象的接口,持有
Implementor
的引用。 - RefinedAbstraction(具体抽象类):扩展抽象类,具体化抽象类的方法。
- Implementor(实现接口):定义实现类的接口。
- ConcreteImplementor(具体实现类):实现具体的功能。
- Abstraction(抽象类):定义高层抽象的接口,持有
优点
- 分离抽象与实现:抽象和实现部分独立扩展。
- 灵活性高:通过组合而非继承,避免类的复杂层级关系。
- 扩展性强:可以独立扩展抽象层和实现层,而不影响彼此。
缺点
- 复杂性增加:引入额外的抽象层,增加了系统复杂度。
- 理解难度较高:相对于简单的继承关系,桥接模式的设计需要更高的理解能力。
示例代码
场景描述
假设我们需要开发一个形状绘制系统,其中形状和颜色是两个维度。如果直接使用继承,可能需要 红色圆形
、蓝色圆形
、红色矩形
等多个类。使用桥接模式,可以将形状和颜色分离,分别实现和扩展。
1. 定义实现接口
// 定义实现接口
public interface Color {
void applyColor();
}
2. 创建具体实现类
// 红色实现类
public class RedColor implements Color {
@Override
public void applyColor() {
System.out.println("Applying red color");
}
}
// 蓝色实现类
public class BlueColor implements Color {
@Override
public void applyColor() {
System.out.println("Applying blue color");
}
}
3. 定义抽象类
// 定义抽象类
public abstract class Shape {
protected Color color; // 持有实现接口的引用
public Shape(Color color) {
this.color = color;
}
public abstract void draw();
}
4. 创建具体抽象类
// 圆形
public class Circle extends Shape {
public Circle(Color color) {
super(color);
}
@Override
public void draw() {
System.out.print("Drawing Circle with ");
color.applyColor();
}
}
// 矩形
public class Rectangle extends Shape {
public Rectangle(Color color) {
super(color);
}
@Override
public void draw() {
System.out.print("Drawing Rectangle with ");
color.applyColor();
}
}
5. 客户端代码
public class BridgePatternExample {
public static void main(String[] args) {
// 创建红色的圆形
Shape redCircle = new Circle(new RedColor());
redCircle.draw();
// 创建蓝色的矩形
Shape blueRectangle = new Rectangle(new BlueColor());
blueRectangle.draw();
}
}
输出结果
Drawing Circle with Applying red color
Drawing Rectangle with Applying blue color
UML 类图
+----------------+ +------------------+
| Shape | | Color |
+----------------+ +------------------+
| - color: Color |<>-------------->| + applyColor() |
| + draw() | +------------------+
+----------------+ ^
^ |
| |
+--------------------+ +--------------------+
| Circle | | RedColor |
+--------------------+ +--------------------+
| + draw() | | + applyColor() |
+--------------------+ +--------------------+
|
+--------------------+
| BlueColor |
+--------------------+
| + applyColor() |
+--------------------+
使用场景
- 多维度变化:
- 产品和平台、图形和颜色等需要独立扩展的场景。
- 避免继承扩展爆炸:
- 如果不使用桥接模式,多维度变化可能导致继承关系过于复杂。
- 需要动态组合:
- 在运行时灵活选择实现。
小结
- 桥接模式解耦了 抽象部分 和 实现部分,使它们可以独立扩展,提升了灵活性。
- 实际开发中,桥接模式常用于 跨平台开发、图形绘制、驱动程序设计 等需要多维度变化的场景。