質問

wikipedia のこのブリッジパターンの例に少し時間を費やしましたが、私はまだこのブリッジパターンが何を説明しようとしているのか理解していない。

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つの引数を取り、そのdraw()メソッドで、最初の3つの引数は、DrawingAPIの任意のサブクラスである4番目の引数に渡されます。 これは、ブリッジパターンを使用すると柔軟性が向上するということですか? そして、この例が私たちに伝えることができる他のことはありますか?

ありがとう!!!!

役に立ちましたか?

解決

これが有用な理由のより具体的な例で、より明確になります。 DrawingAPI1がグラフィックスドライバーをカプセル化し、DrawingAPI2がプリンタードライバーに対して同じことを行うとします。その場合、DrawingAPIはグラフィックスシステムの汎用APIです。 CircleShapeをモニターに描画し、同じコードを使用して紙に印刷できます。異なるDrawingAPI実装を渡すだけです。ただし、DrawingAPIをコンストラクターに渡す代わりにShape.draw()に渡すと、モニターとプリンターに同じオブジェクトグラフを使用できるため、より柔軟になります。

他のヒント

  

サブクラスCircleShapeコンストラクターは4つの引数を取り、そのdraw()メソッドで、最初の3つの引数は、DrawingAPIの任意のサブクラスである4番目の引数に渡されます。これは、ブリッジパターンを使用すると柔軟性が向上するということですか?そして、この例が私たちに伝えることができる他のことはありますか?

柔軟性だけではありません。 ブリッジパターンは、抽象化と実装を分離します。両方とも異なる場合があります

CircleShape はコンポジションを使用して DrawingAPI を継承なしで含むため、 DrawingAPI APIをの複数の実装のいずれかで置き換えることができます。 > DrawingAPI

Shape CircleShape は、 DrawingAPI に依存せずに独立して変更できます。

ブリッジのパターンの詳細については、SEの以下の記事をご覧ください。異なる例を説明しています。

ブリッジパターンは実装から抽象化を分離しますか

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top