Bootstrap

桥接模式 (Bridge Pattern)

桥接模式 (Bridge Pattern)

桥接模式是一种 结构型设计模式,用于将抽象部分与实现部分分离,使它们可以独立变化。它通过组合的方式取代继承,将不同维度的变化解耦,从而提高系统的灵活性。


原理

  1. 核心思想:将一个对象的 抽象部分实现部分 分离开,分别独立定义和扩展。
  2. 适用场景
    • 当一个类有多个维度的变化,需要独立扩展时。
    • 避免因为多维度的变化导致类的数量爆炸。
    • 不希望使用继承方式来扩展时。
  3. 参与角色
    • Abstraction(抽象类):定义高层抽象的接口,持有 Implementor 的引用。
    • RefinedAbstraction(具体抽象类):扩展抽象类,具体化抽象类的方法。
    • Implementor(实现接口):定义实现类的接口。
    • ConcreteImplementor(具体实现类):实现具体的功能。

优点

  1. 分离抽象与实现:抽象和实现部分独立扩展。
  2. 灵活性高:通过组合而非继承,避免类的复杂层级关系。
  3. 扩展性强:可以独立扩展抽象层和实现层,而不影响彼此。

缺点

  1. 复杂性增加:引入额外的抽象层,增加了系统复杂度。
  2. 理解难度较高:相对于简单的继承关系,桥接模式的设计需要更高的理解能力。

示例代码

场景描述

假设我们需要开发一个形状绘制系统,其中形状和颜色是两个维度。如果直接使用继承,可能需要 红色圆形蓝色圆形红色矩形 等多个类。使用桥接模式,可以将形状和颜色分离,分别实现和扩展。


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()    |
                              +--------------------+

使用场景

  1. 多维度变化
    • 产品和平台、图形和颜色等需要独立扩展的场景。
  2. 避免继承扩展爆炸
    • 如果不使用桥接模式,多维度变化可能导致继承关系过于复杂。
  3. 需要动态组合
    • 在运行时灵活选择实现。

小结

  • 桥接模式解耦了 抽象部分实现部分,使它们可以独立扩展,提升了灵活性。
  • 实际开发中,桥接模式常用于 跨平台开发图形绘制驱动程序设计 等需要多维度变化的场景。
;