桥模式示例

时间:2009-11-26 21:40:58

标签: java design-patterns bridge

我花了一些时间在wikipedia的这个Bridge模式示例上,但是,我仍然不明白这个桥模式试图解释什么。

interface DrawingAPI {
    public void drawCircle(double x, double y, double radius);
}

/** "ConcreteImplementor" 1/2 */
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);
   }
}

/** "ConcreteImplementor" 2/2 */
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);
   }
}

/** "Abstraction" */
interface Shape {
   public void draw();                                            // low-level
   public void resizeByPercentage(double pct);     // high-level
}

/** "Refined Abstraction" */
class CircleShape implements Shape {
   private double x, y, radius;
   private DrawingAPI drawingAPI;
   public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) {
       this.x = x;  this.y = y;  this.radius = radius;
       this.drawingAPI = drawingAPI;
   }

   // 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;
   }
}

/** "Client" */
class Main {
   public static void main(String[] args) {
       Shape[] shapes = new Shape[2];
       shapes[0] = new CircleShape(1, 2, 3, new DrawingAPI1());
       shapes[1] = new CircleShape(5, 7, 11, new DrawingAPI2());

       for (Shape shape : shapes) {
           shape.resizeByPercentage(2.5);
           shape.draw();
       }
   }
}

子类CircleShape构造函数采用4个args,在其draw()方法中,前3个args传递给第4个arg,它可以是DrawingAPI的任何子类。 那么这是否意味着使用桥接模式可以增加灵活性? 这个例子可以告诉我们更多的东西吗?

感谢!!!!

2 个答案:

答案 0 :(得分:7)

为什么这有用的一个更具体的例子将使它更清楚。假设DrawingAPI1封装了您的图形驱动程序,而DrawingAPI2则为您的打印机驱动程序执行相同的操作。然后DrawingAPI是您的图形系统的通用API。它允许您将CircleShape绘制到显示器上并使用相同的代码在一张纸上打印,您只需要传递不同的DrawingAPI实现。但是,如果将DrawingAPI传递给Shape.draw()而不是将其传递给构造函数,则会更灵活,因为这样您就可以为监视器和打印机使用相同的对象图。

答案 1 :(得分:0)

  

子类CircleShape构造函数采用4个args,在其draw()方法中,前3个args传递给第4个arg,它可以是DrawingAPI的任何子类。那么这是否意味着使用桥接模式可以增加灵活性?这个例子可以告诉我们更多的东西吗?

这不仅仅是灵活性。 Bridge模式将抽象与实现分离,两者的区别可能不同

由于CircleShape使用合成来包含DrawingAPI没有继承,因此您可以将DrawingAPI API替换为DrawingAPI的多个实现中的任何一个

ShapeCircleShape可以独立更改,而不依赖于DrawingAPI

您可以在SE post下面找到有关Bridge模式的更多详细信息,它解释了不同的示例:

Does the Bridge Pattern decouples an abstraction from implementation?