1. 设计模式-桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与它的实现部分分离,使它们可以独立变化。这种模式通过创建一个抽象类和一个实现类的层次结构,将类的抽象部分和它的实现部分分离开来,从而可以更加灵活地组合对象。

桥接模式的关键在于将抽象(Abstraction)与实现(Implementation)分离开来,并通过一个“桥”(Bridge)来连接它们。抽象部分定义了操作的接口,但不包含任何具体实现;实现部分则提供了抽象部分的具体实现。两者通过聚合关系(而不是继承关系)耦合在一起,使得抽象和实现可以独立变化。

假设我们要设计一个图形界面库,它支持不同的图形(圆形、矩形)和不同的绘制平台(Windows、Linux)。

2. 抽象化(Abstraction)

public abstract class Shape {
    protected DrawingAPI api;

    protected Shape(DrawingAPI drawingAPI) {
        this.api = drawingAPI;
    }

    public abstract void draw();
    public abstract void resizeByPercentage(double pct);
}

3. 实现化接口(Implementor)

public interface DrawingAPI {
    void drawCircle(int x, int y, int radius);
    void drawRectangle(int x, int y, int width, int height);
}

4. 具体实现化类(Concrete Implementor)

public class DrawingAPI1 implements DrawingAPI {
    @Override
    public void drawCircle(int x, int y, int radius) {
        System.out.println("API1.circle at " + x + "," + y + " radius " + radius);
    }

    @Override
    public void drawRectangle(int x, int y, int width, int height) {
        System.out.println("API1.rectangle at " + x + "," + y + " width " + width + " height " + height);
    }
}

public class DrawingAPI2 implements DrawingAPI {
    @Override
    public void drawCircle(int x, int y, int radius) {
        System.out.println("API2.circle at " + x + "," + y + " radius " + radius);
    }

    @Override
    public void drawRectangle(int x, int y, int width, int height) {
        System.out.println("API2.rectangle at " + x + "," + y + " width " + width + " height " + height);
    }
}

5. 具体抽象化类(Refined Abstraction)

public class Circle extends Shape {
    private int x, y, radius;

    public Circle(DrawingAPI api, int x, int y, int radius) {
        super(api);
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    @Override
    public void draw() {
        api.drawCircle(x, y, radius);
    }

    @Override
    public void resizeByPercentage(double pct) {
        radius *= pct;
    }
}

public class Rectangle extends Shape {
    private int x, y, width, height;

    public Rectangle(DrawingAPI api, int x, int y, int width, int height) {
        super(api);
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }

    @Override
    public void draw() {
        api.drawRectangle(x, y, width, height);
    }

    @Override
    public void resizeByPercentage(double pct) {
        width *= pct;
        height *= pct;
    }
}

6. 使用示例

public class BridgePatternDemo {
    public static void main(String[] args) {
        Shape circle = new Circle(new DrawingAPI1(), 100, 200, 30);
        Shape rectangle = new Rectangle(new DrawingAPI2(), 150, 250, 50, 40);

        circle.draw();
        rectangle.draw();
    }
}

桥接模式通过分离抽象和实现,为系统提供了更高的灵活性和扩展性,尤其适合于那些需要支持多种实现方式的场景。它强调了“抽象和实现分离”的原则,有助于减少代码间的耦合,提高软件的可维护性和可扩展性。然而,是否采用桥接模式还需根据实际项目需求和复杂度来决定,避免不必要的设计复杂化。

7. 优点

  1. 分离抽象与实现:使得两者可以独立变化,有助于提高系统的可扩展性和可维护性。
  2. 更好的扩展性:可以轻松添加新的抽象类和实现类,而不会影响现有类。
  3. 优化设计:通过减少类的个数,降低系统的复杂度。

8. 缺点

  1. 增加系统的理解与设计难度:由于引入了更多的抽象和接口,初学者可能觉得设计变得更复杂。
  2. 过度设计风险:对于简单的需求,使用桥接模式可能会显得过度设计。