设计模式-桥接模式
桥接模式(Bridge Pattern) 是一种结构型设计模式,旨在通过将抽象部分和实现部分分离,使得两者可以独立变化。桥接模式可以避免在多重继承结构中创建大量的子类,从而使得系统更加灵活且易于扩展。
桥接模式的核心思想
桥接模式将对象的抽象部分(抽象类)和具体实现部分(实现类)分离开来,使得它们可以独立变化,从而避免了大量的继承关系。通过这种方式,可以通过组合(而非继承)来改变类的行为。
桥接模式的组成部分
- 抽象类(Abstraction):定义了高层接口,包含一个对实现接口的引用。
- 扩展抽象类(RefinedAbstraction):继承抽象类,通常会增加一些额外的功能。
- 实现接口(Implementor):定义了实现类的接口,但不提供具体实现。
- 具体实现类(ConcreteImplementor):提供实现接口的具体实现。
桥接模式的使用场景
- 当你不希望在类的抽象层和实现层之间产生大量的子类时。
- 当你希望在不修改抽象部分和实现部分的情况下,改变两者的实现时。
- 当一个类存在多个变化维度,而这两个维度独立变化时。
桥接模式的示例(Java代码)
假设我们要开发一个图形绘制的系统,支持不同形状(如圆形、矩形)和不同颜色(如红色、蓝色)来绘制。
1. 定义实现接口 Color
// 实现接口:颜色接口
interface Color {
void fillColor();
}
2. 实现 Color 接口的具体类
// 具体实现类:红色
class RedColor implements Color {
@Override
public void fillColor() {
System.out.println("填充红色");
}
}
// 具体实现类:蓝色
class BlueColor implements Color {
@Override
public void fillColor() {
System.out.println("填充蓝色");
}
}
3. 定义抽象类 Shape
// 抽象类:形状类
abstract class Shape {
// 持有一个颜色对象
protected Color color;
// 构造函数注入颜色实现类
public Shape(Color color) {
this.color = color;
}
// 抽象方法:绘制图形
public abstract void draw();
}
4. 扩展抽象类 Shape,定义具体形状类
// 具体类:圆形
class Circle extends Shape {
public Circle(Color color) {
super(color);
}
@Override
public void draw() {
System.out.print("绘制圆形,");
color.fillColor();
}
}
// 具体类:矩形
class Rectangle extends Shape {
public Rectangle(Color color) {
super(color);
}
@Override
public void draw() {
System.out.print("绘制矩形,");
color.fillColor();
}
}
5. 客户端代码
public class BridgePatternExample {
public static void main(String[] args) {
// 创建颜色对象
Color red = new RedColor();
Color blue = new BlueColor();
// 创建不同颜色的形状
Shape circle = new Circle(red);
Shape rectangle = new Rectangle(blue);
// 绘制图形
circle.draw(); // 绘制圆形,填充红色
rectangle.draw(); // 绘制矩形,填充蓝色
}
}
桥接模式的解释
-
抽象类
Shape和 实现接口Color之间没有直接的继承关系,而是通过组合的方式持有Color的引用。这样,Shape和Color就能够独立变化。例如,你可以增加更多的Shape类型(如三角形、椭圆等)或者增加更多的Color类型(如绿色、黄色等),而不需要修改现有的类。 -
Circle和Rectangle类是对Shape的具体实现,它们通过构造方法接受不同的颜色实现类(例如红色或蓝色)。Shape通过调用color.fillColor()来实现与颜色相关的操作。 -
客户端(
BridgePatternExample)通过组合的方式创建了不同的形状和颜色对象,并调用draw()方法来绘制不同颜色的图形。
优点
- 减少了类的数量:通过桥接模式,可以避免多重继承导致的类爆炸问题。例如,如果没有桥接模式,每增加一个形状和颜色的组合,就需要一个新的类。
- 扩展性强:可以在不改变现有代码的情况下,添加新的形状和颜色。由于它们是通过接口和实现分离的,所以新类型可以独立增加。
- 灵活性高:通过组合而不是继承来实现类的功能扩展,可以灵活地改变每个类的行为。
缺点
- 增加了系统的复杂性:桥接模式使得类的设计更加灵活,但也增加了系统的复杂性,尤其是当实现和抽象部分之间的关系比较复杂时。
总结
桥接模式将抽象和实现分离,使得它们可以独立变化。通过组合而非继承来扩展类的功能,从而降低了类之间的耦合度,提高了系统的灵活性和可扩展性。在需要独立变化的多个维度(例如形状和颜色)时,桥接模式非常有效。

浙公网安备 33010602011771号