Frage

hatte ich einige Zeit auf dieser Brücke Musterbeispiel verbringen von wikipedia ich aber nach wie vor nicht verstehen, was diese Brücke Muster zu erklären versuchen.

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();
       }
   }
}

Die Unterklasse CircleShape Konstruktor 4 args in seiner draw () Methode, die ersten 3 args sind in den 4. Arg- geleitet, die eine beliebige Unterklasse von DrawingAPI sein kann. So bedeutet das, dass Brückenmuster mit Flexibilität erhöhen? und gibt es mehr Dinge in diesem Beispiel kann uns sagen?

Danke !!!!

War es hilfreich?

Lösung

Ein konkreteres Beispiel, warum dies sinnvoll ist, wird es klarer. Angenommen DrawingAPI1 Ihre Grafiktreiber kapselt, während DrawingAPI2 die gleiche Sache für Ihren Druckertreiber der Fall ist. Dann ist DrawingAPI die allgemeine API für Grafiksystem. Damit können Sie einen CircleShape auf dem Monitor ziehen und es auf einem Stück Papier drucken, den gleichen Code verwenden, müssen Sie nur in den verschiedenen DrawingAPI Implementierungen zu übergeben. Wenn Sie jedoch DrawingAPI in Shape.draw () statt es in den Konstruktor übergeben, es wäre flexibler passieren, denn dann können Sie das gleiche Objekt Diagramm für den Monitor und den Drucker verwenden.

Andere Tipps

  

Die Unterklasse CircleShape Konstruktor 4 args in seiner draw () Methode, die ersten 3 args sind in den 4. Arg- geleitet, die eine beliebige Unterklasse von DrawingAPI sein kann. So bedeutet das, dass Brückenmuster mit Flexibilität erhöhen? und gibt es mehr Dinge in diesem Beispiel kann uns sagen?

Es ist nicht nur die Flexibilität. Die Brücke Muster abkoppelt Abstraktion von der Implementierung und beide können unterschiedlich variieren .

Da CircleShape verwendet Zusammensetzung DrawingAPI enthalten mit-out Vererbung können Sie DrawingAPI API mit einem von mehreren Implementierungen von DrawingAPI

ersetzen

Shape und CircleShape kann unabhängig ohne Abhängigkeit ändern auf DrawingAPI.

Sie können mehr Details über Brücke Muster finden in unten SE Post, die unterschiedliche Beispiel erläutert:

Ist die Brücke Pattern abkoppelt eine Abstraktion von der Implementierung?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top