下面给出一个使用桥接模式的示例,假设我们正在编写一个图形库,其中包括两个图形:圆形和矩形。我们希望支持两种不同的绘制方式:普通绘制和高级绘制。普通绘制使用标准的绘图API,而高级绘制使用OpenGL API。
首先,我们需要定义一个图形的抽象部分,这里使用抽象类
代码语言:javascript复制// Abstraction - 图形的抽象部分
public abstract class Shape {
protected DrawingAPI drawingAPI; // 引用实现部分的对象
protected Shape(DrawingAPI drawingAPI) {
this.drawingAPI = drawingAPI;
}
public abstract void draw(); // 抽象方法,表示图形的绘制操作
}
然后,我们需要定义具体的图形部分,这里使用圆形和矩形来演示:
代码语言:javascript复制// RefinedAbstraction - 圆形
public 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;
}
@Override
public void draw() {
drawingAPI.drawCircle(x, y, radius);
}
}
// RefinedAbstraction - 矩形
public class Rectangle extends Shape {
private double x, y, width, height; // 矩形的坐标、宽度和高度
public Rectangle(double x, double y, double width, double height, DrawingAPI drawingAPI) {
super(drawingAPI);
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
@Override
public void draw() {
drawingAPI.drawRectangle(x, y, width, height);
}
}
接下来,我们需要定义实现部分,这里使用接口来演示:
代码语言:javascript复制// Implementor - 绘图API的接口
public interface DrawingAPI {
void drawCircle(double x, double y, double radius);
void drawRectangle(double x, double y, double width, double height);
}
最后,我们需要定义具体的实现部分,这里使用标准绘图API和OpenGL API来演示:
代码语言:javascript复制// ConcreteImplementor - 标准绘图API的实现类
public class StandardDrawingAPI implements DrawingAPI {
@Override
public void drawCircle(double x, double y, double radius) {
System.out.printf("Drawing a circle at (%f, %f) with radius %f using standard drawing APIn", x, y, radius);
}
@Override
public void drawRectangle(double x, double y, double width, double height) {
System.out.printf("Drawing a rectangle at (%f, %f) with width %f and height %f using standard drawing APIn", x, y, width, height);
}
}
// ConcreteImplementor - OpenGL API的实现类
public class OpenGLDrawingAPI implements DrawingAPI {
@Override
public void drawCircle(double x, double y, double radius) {
System.out.printf("Drawing a circle at (%f, %f) with radius %f using OpenGL APIn", x, y, radius);
}
@Override
public void drawRectangle(double x, double y, double width, double height) {
System.out.printf("Drawing a rectangle at (%f, %f) with width %f and height %f using OpenGL APIn", x, y, width, height);
}
}
现在,我们可以使用桥接模式来组合抽象部分和实现部分,完成具体的功能。下面是一个示例代码:
代码语言:javascript复制public class BridgeDemo {
public static void main(String[] args) {
// 使用标准绘图API绘制圆形
DrawingAPI standardAPI = new StandardDrawingAPI();
Shape circle = new Circle(1, 2, 3, standardAPI);
circle.draw();
// 使用OpenGL API绘制矩形
DrawingAPI openglAPI = new OpenGLDrawingAPI();
Shape rectangle = new Rectangle(4, 5, 6, 7, openglAPI);
rectangle.draw();
}
}
运行以上代码,将输出:
代码语言:javascript复制Drawing a circle at (1.000000, 2.000000) with radius 3.000000 using standard drawing API
Drawing a rectangle at (4.000000, 5.000000) with width 6.000000 and height 7.000000 using OpenGL API
可以看到,使用桥接模式,我们可以将抽象部分和实现部分分离,使得它们可以独立地变化。在以上示例中,我们分别使用了标准绘图API和OpenGL API来实现绘制圆形和矩形的功能,而这些实现细节都被封装在实现部分中,抽象部分不需要关心这些细节。如果需要添加新的实现方式,只需要定义一个新的实现部分即可,而不需要修改已有的抽象部分和具体部分的代码。