質問
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の以下の記事をご覧ください。異なる例を説明しています。