文章摘要: 桥接模式使用总结。
简介
简要说明
- 桥接模式(Bridge Pattern)是一种结构型设计模式。
- 通过将抽象部分(Abstraction)与实现部分(Implementor)分离,使它们可以独立地变化。
- 这种模式涉及到一个作为桥接的接口,这个接口使得抽象部分和实现部分可以相互独立地扩展。
主要功能
- 分离抽象和实现,使它们可以独立变化,互不影响。
- 提高了系统的可扩展性,因为抽象和实现都可以独立扩展。
- 避免了继承层次的快速膨胀。
注意事项
- 桥接模式可能会增加系统的复杂度,因为它引入了额外的抽象层和实现层。
- 应该在抽象和实现确实需要独立变化时使用桥接模式,否则可能会造成不必要的复杂。
- 在设计时需要考虑如何将抽象部分和实现部分分离开来。
适用场景
- 当一个类存在两个或多个独立变化的维度时,且这两个维度都需要进行扩展。
- 当不希望使用继承导致类爆炸时。
- 当一个类需要其子类的行为,但这些子类的实现可能变化时。
Java 8
案例
// 实现部分接口
interface DrawingAPI {
void drawCircle(double x, double y, double radius);
}
// 具体实现部分
class DrawingAPI1 implements DrawingAPI {
public 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 {
public 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(); // low-level i.e. Implementation specific
public abstract void resizeByPercentage(double pct); // high-level i.e. Abstraction specific
}
// 扩展抽象部分
class Circle extends Shape {
private double x, y, radius;
public Circle(double x, double y, double radius, DrawingAPI drawingAPI) {
super(drawingAPI);
this.x = x;
this.y = y;
this.radius = radius;
}
// low-level i.e. Implementation specific
public void draw() {
drawingAPI.drawCircle(x, y, radius);
}
// high-level i.e. Abstraction specific
public void resizeByPercentage(double pct) {
radius *= pct;
}
}
// 客户端代码
public class BridgePatternDemo {
public static void main(String[] args) {
Shape redCircle = new Circle(1, 2, 3, new DrawingAPI1());
Shape greenCircle = new Circle(5, 7, 8, new DrawingAPI2());
redCircle.draw();
greenCircle.draw();
redCircle.resizeByPercentage(2.5);
greenCircle.resizeByPercentage(2.5);
redCircle.draw();
greenCircle.draw();
}
}
注释
- 在这个例子中,
DrawingAPI是实现部分的接口,它定义了绘制图形的方法。DrawingAPI1和DrawingAPI2是具体的实现类。 Shape是抽象部分的基类,它包含了一个指向实现部分接口的引用。Circle是扩展抽象部分的具体类,它实现了绘制和调整大小的功能。- 客户端代码可以创建不同实现和抽象组合的实例,从而实现抽象和实现的独立变化。