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