设计模式-桥接模式(Bridge Pattern)

918 阅读4分钟

Github 源码地址

23种设计模式总览

创建型模式

结构型模式

行为型模式

定义

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

关键代码: 抽象类依赖实现类。

而桥接模式有两种理解方式:

  • 将抽象和实现解耦,让它们能独立开发;(应用场景较少)
  • 用抽象关联取代多层继承,将类间的继承关系转换为动态的对象组合关系; (用得较多,避免了多层继承类爆炸问题)

使用场景

  1. 一个系统需要在构建的抽象化橘色和具体化角色间增加更多灵活性,避免在两个层次间建立静态继承关系,可以通过桥接模式使他们在抽象层建立一个关联关系。
  2. 一个类存在两个独立变化的维度,切两个维度都需要扩展。
  3. 对于不希望使用继承或因多层次继承导致系统类的个数急剧增加的系统,也可使用桥接模式。

优缺点

优点:  1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。

缺点: 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

具体实现

比如,现在有一个圆形和矩形,它们可以抽象出形状这个父类,然后它们对应两个子类:

abstract class Shape {
    abstract void show();
}

public class Circle extends Shape {
    @Override void show() { System.out.println("圆形"); }
}

public class Square extends Shape {
    @Override void show() { System.out.println("矩形"); }
}

如果加入了变化:颜色,有红色和蓝色,跟形状组合组合成下面四种父类:

public class RedCircle extends Shape {
    @Override void show() { System.out.println("红色圆形"); }
}

public class RedSquare extends Shape {
    @Override void show() { System.out.println("红色矩形"); }
}

public class BlueCircle extends Shape {
    @Override void show() { System.out.println("蓝色圆形"); }
}

public class BlueSquare extends Shape {
    @Override void show() { System.out.println("蓝色矩形"); }
}

如果增加了形状三角形和椭圆形,那么此时子类数量变成4 * 2 = 8,如果再在增加颜色金色,那么此时子类数量变成4 * 3 = 12,形状和颜色的加多,类就炸了!

引入桥接模式可以解决这种问题,这里的两个变化维度很清晰:形状 & 颜色,我们把前者理解为 抽象部分,后者理解为 实现部分,在它们之间搭座桥。

实现代码如下:

// 颜色 → 实现部分
public interface IColor {
    String draw();
}

// 红色、蓝色 → 实现部分具体实现
public class Red implements IColor {
    @Override public String draw() { return "红色"; }
}

public class Blue implements IColor {
    @Override
    public String draw() { return "蓝色"; }
}

// 形状 → 抽象部分
abstract class Shape {
    // 形状持有颜色引用,颜色引用通过构造函数注入,这就是桥接过程
    protected IColor color;
    public Shape(IColor color) { this.color = color; }
    abstract void show();
}

// 圆型、矩形 → 抽象部分扩展
public class Circle extends Shape {
    public Circle(IColor color) { super(color); }
    @Override void show() { System.out.println(color.draw() + "圆形"); }
}

public class Square extends Shape {
    public Square(IColor color) { super(color); }
    @Override void show() { System.out.println(color.draw() + "矩形"); }
}

运行输出结果如下

// 测试用例
public class CircleTest {
    public static void main(String[] args) {
        Shape redCircle = new Circle(new Red());
        Shape blueSquare = new Square(new Blue());
        redCircle.show();
        blueSquare.show();
    }
}
红色圆形
蓝色矩形