2009-11-26 7 views
5

私はこのブリッジパターンの例を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コンストラクタがdraw()メソッドでは、4つの引数をとり、第3引数はDrawingAPIから任意のサブクラスであることができる第4引数に渡されます。 これは、ブリッジパターンを使用すると柔軟性を高めることができるということですか? この例で私たちに伝えることができるものがありますか?

ありがとう!!!!

答えて

6

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

+1

おかげで、私は今のパターンのより明確な見解を持っています。 パターンに関するGoogleの時間が終わってから、パターンの良いリンクが見つかりました http://www.allappforum.com/java_design_patterns/creational_patterns.htm ブリッジパターンについての簡単な例があります。 Switchというインターフェースがあり、2つのサブクラスはBulbとFanと呼ばれ、それぞれのサブクラスはSwitch.Aの独自の実装を持っています。 – user200340

0

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

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

CircleShapeを継承せずにDrawingAPIが含まれているために組成物を使用しているので、あなたはDrawingAPI

ShapeCircleShapeの複数の実装のいずれかがDrawingAPIに依存せずに独立して変更することができてDrawingAPI APIを置き換えることができます。

あなたは別の例を説明するSEポスト、以下にブリッジパターンの詳細を見つけることができます。

Does the Bridge Pattern decouples an abstraction from implementation?

関連する問題