桥接模式(Bridge Pattern)是一种结构型设计模式,旨在将抽象部分与它的实现部分分离,以便两者可以独立地变化。它通过提供一个抽象层将它们连接起来,从而避免了类的爆炸式扩展,尤其在面对复杂对象时显得特别有用。
核心思想
桥接模式的核心是组合优于继承。它使用组合的方式,将一个类的抽象部分和实现部分分离开,使得它们可以独立地扩展,而不是通过继承强耦合在一起。
结构
桥接模式的主要参与者有以下几个部分:
-
抽象类(Abstraction): 定义高层的抽象接口,维护一个指向实现部分(Implementor)的引用。
-
实现类接口(Implementor): 定义实现类的接口,通常是抽象方法。
-
具体实现类(ConcreteImplementor): 实现 Implementor 接口,定义具体实现。
-
扩展抽象类(RefinedAbstraction): 在抽象类的基础上进行扩展,通常会调用 Implementor 的方法。
案例代码
示例:绘图工具
假设你想设计一个可以绘制形状(圆形、正方形)的工具,同时需要支持多种颜色(红色、蓝色)。
java
// 实现接口
interface Color {
void applyColor();
}
// 具体实现类
class RedColor implements Color {
@Override
public void applyColor() {
System.out.println("Applying red color.");
}
}
class BlueColor implements Color {
@Override
public void applyColor() {
System.out.println("Applying blue color.");
}
}
// 抽象类
abstract class Shape {
protected Color color; // 组合颜色
public Shape(Color color) {
this.color = color;
}
abstract void draw();
}
// 扩展抽象类
class Circle extends Shape {
public Circle(Color color) {
super(color);
}
@Override
void draw() {
System.out.print("Drawing Circle with ");
color.applyColor();
}
}
class Square extends Shape {
public Square(Color color) {
super(color);
}
@Override
void draw() {
System.out.print("Drawing Square with ");
color.applyColor();
}
}
// 使用桥接模式
public class BridgePatternDemo {
public static void main(String[] args) {
Shape redCircle = new Circle(new RedColor());
Shape blueSquare = new Square(new BlueColor());
redCircle.draw();
blueSquare.draw();
}
}
适用场景
- 需要在多个维度上扩展类时,例如形状和颜色。
- 不希望类之间有紧耦合关系,想通过组合提高灵活性。
- 避免继承体系膨胀的问题。
优缺点
- 优点
解耦:抽象和实现分离,便于独立变化。
扩展性强:可以独立扩展抽象层或实现层。
遵循开闭原则:新增功能时无需修改现有代码。 - 缺点
增加了系统的复杂性,尤其在简单场景下,可能显得"过度设计"。