设计模式-桥接模式示例

2023-05-04 14:02:21 浏览数 (1)

下面给出一个使用桥接模式的示例,假设我们正在编写一个图形库,其中包括两个图形:圆形和矩形。我们希望支持两种不同的绘制方式:普通绘制和高级绘制。普通绘制使用标准的绘图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来实现绘制圆形和矩形的功能,而这些实现细节都被封装在实现部分中,抽象部分不需要关心这些细节。如果需要添加新的实现方式,只需要定义一个新的实现部分即可,而不需要修改已有的抽象部分和具体部分的代码。

0 人点赞