Eine Brücke Muster Beispiel
-
05-07-2019 - |
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 !!!!
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
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?