8

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

接口绘图API {
    公共无效drawCircle(双x,双y,双半径);
}

/** "ConcreteImplementor" 1/2 */
类 DrawingAPI1 实现 DrawingAPI {
   公共无效drawCircle(双x,双y,双半径){
        System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius);
   }
}

/** "ConcreteImplementor" 2/2 */
类 DrawingAPI2 实现 DrawingAPI {
   公共无效drawCircle(双x,双y,双半径){
        System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius);
   }
}

/** “抽象” */
界面形状{
   公共无效绘制();// 低级
   public void resizeByPercentage(double pct); // 高水平
}

/** “精炼抽象” */
类 CircleShape 实现形状 {
   私人双 x,y,半径;
   私有绘图API绘图API;
   public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) {
       这个.x = x; 这个.y = y; this.radius = 半径;
       this.drawingAPI = 绘图API;
   }

   // 低级,即特定于实现
   公共无效绘制(){
        绘图API.drawCircle(x, y, 半径);
   }
   // 高级别的,即抽象特定的
   公共无效resizeByPercentage(双百分比){
        半径 *= pct;
   }
}

/** “客户” */
类主{
   公共静态无效主要(字符串[]参数){
       形状 [] 形状 = 新形状 [2];
       形状[0] = new CircleShape(1, 2, 3, new DrawingAPI1());
       形状[1] = new CircleShape(5, 7, 11, new DrawingAPI2());

       对于(形状形状:形状){
           shape.resizeByPercentage(2.5);
           形状.draw();
       }
   }
}

子类 CircleShape 构造函数接受 4 个参数,在它的 draw() 方法中,前 3 个参数被传递给第四个参数,它可以是来自 DrawingAPI 的任何子类。那么这是否意味着使用桥接模式可以增加灵活性呢?这个例子还能告诉我们更多的事情吗?

谢谢!!!!

4

2 回答 2

7

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

于 2009-11-26T21:59:46.430 回答
0

子类 CircleShape 构造函数接受 4 个参数,在它的 draw() 方法中,前 3 个参数被传递给第四个参数,它可以是来自 DrawingAPI 的任何子类。那么这是否意味着使用桥接模式可以增加灵活性呢?这个例子还能告诉我们更多的事情吗?

这不仅仅是灵活性。桥接模式将抽象与实现分离,两者可以不同

由于CircleShape使用组合来包含DrawingAPI无继承,因此您可以将 DrawingAPIAPI 替换为多个实现中的任何一种DrawingAPI

Shape并且CircleShape可以独立更改而不依赖于DrawingAPI.

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

桥接模式是否将抽象与实现分离?

于 2016-07-10T14:38:05.627 回答