桥接模式是什么
桥接模式是一种结构型设计模式,用于将抽象部分和其具体实现部分解耦,使它们可以独立变化。该模式通过将抽象和实现部分分离,使它们可以独立地扩展和变化。
在桥接模式中,有两个关键角色:抽象部分和实现部分。抽象部分定义了高层的抽象接口,包含了一些操作方法,而实现部分则实现了抽象部分的接口。通过桥接模式,可以轻松地在两个角色之间进行切换和扩展。
桥接模式主要解决了多层继承的问题。在传统的继承关系中,父类与其子类之间存在着强耦合关系,并且随着层次的增加,继承关系会变得越来越复杂。而桥接模式通过将继承关系改为聚合关系,将复杂的继承关系转变为简单的关联关系,降低了系统的复杂性并提高了灵活性。
桥接模式优缺点
桥接模式是一种结构型设计模式,它可以将抽象部分与实现部分分离,使它们可以独立地变化。以下是桥接模式的优缺点:
优点:
- 分离抽象和实现部分,使它们可以独立地扩展和变化,增强了代码的灵活性。
- 可以在运行时动态改变抽象和实现部分的关联关系。
- 提高了系统的可扩展性和可维护性,因为抽象部分和实现部分的变化不会相互影响。
缺点:
- 增加了系统的复杂性,因为需要定义抽象接口和实现类,以及它们之间的关联关系。
- 增加了系统的理解和学习成本,因为需要理解和掌握桥接模式的概念和使用方法。
桥接模式应用场景
桥接模式适用于以下情况:
-
当一个类存在两个或多个独立变化的维度时,可以使用桥接模式。这些维度可以通过不同的层次进行扩展。
-
当一个类不希望与其它类产生耦合关系,可以使用桥接模式。通过将抽象部分和实现部分分离,可以独立地对它们进行扩展。
-
当一个类需要通过多个维度进行变化,可以使用桥接模式。通过桥接模式可以避免类的膨胀。
-
当一个类需要在运行时切换不同的实现,可以使用桥接模式。通过运行时的动态绑定,可以选择不同的实现。
-
当一个类需要在多个平台上使用不同的实现,可以使用桥接模式。通过桥接模式可以方便地切换不同的实现。
代码示例
// 实现部分接口
interface DrawingAPI {void drawCircle(double x, double y, double radius);
}// 具体的实现部分
class DrawingAPI1 implements DrawingAPI {@Overridepublic void drawCircle(double x, double y, double radius) {System.out.printf("API1.circle at %f:%f radius %f%n", x, y, radius);}
}// 具体的实现部分
class DrawingAPI2 implements DrawingAPI {@Overridepublic void drawCircle(double x, double y, double radius) {System.out.printf("API2.circle at %f:%f radius %f%n", x, y, radius);}
}// 抽象部分
abstract class Shape {protected DrawingAPI drawingAPI;protected Shape(DrawingAPI drawingAPI) {this.drawingAPI = drawingAPI;}public abstract void draw();public abstract void resizeByPercentage(double pct);
}// 具体的抽象部分
class CircleShape extends Shape {private double x, y, radius;public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) {super(drawingAPI);this.x = x;this.y = y;this.radius = radius;}@Overridepublic void draw() {drawingAPI.drawCircle(x, y, radius);}@Overridepublic void resizeByPercentage(double pct) {radius *= (1.0 + pct/100.0);}
}public class BridgePatternExample {public static void main(String[] args) {Shape circleShape1 = new CircleShape(1, 2, 3, new DrawingAPI1());Shape circleShape2 = new CircleShape(5, 7, 11, new DrawingAPI2());circleShape1.resizeByPercentage(2.5);circleShape2.resizeByPercentage(4.5);circleShape1.draw();circleShape2.draw();}
}
在上面的示例中,我们首先定义了一个接口DrawingAPI
,它声明了一个drawCircle
方法。然后我们实现了两个具体的实现类DrawingAPI1
和DrawingAPI2
,它们分别实现了drawCircle
方法来绘制圆。
接下来,我们定义了一个抽象类Shape
,它包含一个对DrawingAPI
的引用,并且声明了draw
和resizeByPercentage
方法。
最后,我们定义了一个具体的类CircleShape
,它继承自Shape
,并且实现了draw
和resizeByPercentage
方法。在draw
方法中,我们调用了drawingAPI
的drawCircle
方法来绘制圆。
在应用程序的入口点中,我们创建了两个CircleShape
对象,并且调用了resizeByPercentage
方法来调整圆的大小。然后我们调用draw
方法来绘制圆。
这个例子中,CircleShape
是抽象部分,DrawingAPI
是实现部分。通过将抽象部分和实现部分分离,我们可以独立地对它们进行扩展和变化,增强了灵活性和可维护性。
总结
桥接模式是一种结构型设计模式,用于将抽象部分与实现部分分离,使它们可以独立变化。
在桥接模式中,抽象部分和实现部分各自有自己的抽象类和实现类。抽象部分中的方法依赖于实现部分的接口,通过桥接模式,可以在运行时将不同的实现部分动态地注入到抽象部分中。
桥接模式的关键角色包括抽象类(Abstraction)、具体抽象类(ConcreteAbstraction)、实现类接口(Implementor)和具体实现类(ConcreteImplementor)。
通过桥接模式,我们可以轻松地扩展和变化抽象部分和实现部分,而且它们可以独立地变化,互不影响。这使得桥接模式非常适用于应对多样化的需求和变化。
总结一下桥接模式的优点:
- 分离抽象部分和实现部分,使它们可以独立变化。
- 提高了系统的可扩展性,可灵活地增加新的抽象类和实现类。
- 对客户端隐藏了具体实现,使客户端只关注抽象部分。
然而,桥接模式也有一些缺点:
- 增加了系统的复杂性,因为需要定义抽象部分和实现部分的接口和实现类。
- 桥接模式可能会导致系统中存在大量的类和对象,增加了系统的维护难度。