Pregunta

Pasé algo de tiempo en este ejemplo de patrón de puente de wikipedia , sin embargo, todavía No entiendo qué es este patrón de puente que intenta explicar.

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

El constructor de la subclase CircleShape toma 4 argumentos, en su método draw (), los primeros 3 argumentos se pasan al cuarto argumento, que puede ser cualquier subclase de DrawingAPI. Entonces, ¿significa esto que usar el patrón de puente puede aumentar la flexibilidad? ¿Y hay más cosas que este ejemplo nos puede decir?

Gracias !!!!

¿Fue útil?

Solución

Un ejemplo más concreto de por qué esto es útil lo hará más claro. Supongamos que DrawingAPI1 encapsula su controlador de gráficos, mientras que DrawingAPI2 hace lo mismo para su controlador de impresora. Entonces DrawingAPI es la API genérica para su sistema de gráficos. Te permite dibujar un CircleShape en tu monitor e imprimirlo en una hoja de papel usando el mismo código, solo tienes que pasar las diferentes implementaciones de DrawingAPI. Sin embargo, si pasa DrawingAPI a Shape.draw () en lugar de hacerlo al constructor, sería más flexible porque entonces puede usar el mismo gráfico de objetos para el monitor y la impresora.

Otros consejos

  

El constructor de la subclase CircleShape toma 4 argumentos, en su método draw (), los primeros 3 argumentos se pasan al cuarto argumento, que puede ser cualquier subclase de DrawingAPI. Entonces, ¿significa esto que usar el patrón de puente puede aumentar la flexibilidad? ¿Y hay más cosas que este ejemplo nos puede decir?

No es solo la flexibilidad. El patrón de puente desacopla la abstracción de la implementación y ambos pueden variar de manera diferente .

Dado que CircleShape utiliza la composición para contener DrawingAPI sin herencia, puede reemplazar la API de DrawingAPI con cualquiera de las múltiples implementaciones de DrawingAPI

Shape y CircleShape pueden cambiar independientemente sin la dependencia de DrawingAPI .

Puede encontrar más detalles sobre el patrón de puente en la publicación SE más abajo, lo que explica diferentes ejemplos:

¿El patrón de puente desacopla una abstracción de la implementación?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top