8

ウィキペディアのこのブリッジ パターンの例にしばらく時間を費やしましたが、このブリッジ パターンが何を説明しようとしているのかまだわかりません。

インターフェイス DrawingAPI {
    public void drawCircle(double x, double y, double radius);
}

/** "ConcreteImplementor" 1/2 */
クラス DrawingAPI1 は 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 */
クラス DrawingAPI2 は DrawingAPI を実装します {
   public void drawCircle(double x, double y, double radius) {
        System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius);
   }
}

/** 「抽象化」 */
インターフェイス形状{
   public void draw(); // 低レベル
   public void resizeByPercentage(double pct); // 上級
}

/** 「洗練された抽象化」 */
クラスCircleShapeはShapeを実装します{
   private double x、y、radius;
   プライベート DrawingAPI drawingAPI;
   public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) {
       this.x = x; this.y = y; this.radius = 半径;
       this.drawingAPI = drawingAPI;
   }

   // 低レベル、つまり実装固有
   public void draw() {
        drawingAPI.drawCircle(x, y, 半径);
   }
   // 高レベル、つまり抽象化固有
   public void resizeByPercentage(double pct) {
        半径 *= pct;
   }
}

/** "クライアント" */
クラスメイン{
   public static void main(String[] args) {
       シェイプ[] シェイプ = 新しいシェイプ[2];
       形状[0] = new CircleShape(1, 2, 3, new DrawingAPI1());
       形状[1] = new CircleShape(5, 7, 11, new DrawingAPI2());

       for (シェイプ shape : シェイプ) {
           shape.resizeByPercentage(2.5);
           shape.draw();
       }
   }
}

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

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

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

ShapeCircleShape依存せずに独立して変更できますDrawingAPI

ブリッジ パターンの詳細については、以下の SE 投稿で確認できます。別の例が説明されています。

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

于 2016-07-10T14:38:05.627 に答える