2009-11-26 20 views
5

Pasé algún tiempo en este ejemplo de patrón de puente de wikipedia, sin embargo, todavía no entiendo qué es lo que intenta explicar este patrón de puente.Un ejemplo de patrón de puente

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

La subclase CircleShape constructor toma 4 args, en su método draw(), los primeros 3 args se pasan a la cuarta arg que puede ser cualquier subclase de DrawingAPI. ¿Significa esto que el uso de un patrón de puente puede aumentar la flexibilidad? y hay más cosas que este ejemplo pueda decirnos?

Gracias !!!!

Respuesta

6

Un ejemplo más concreto de por qué 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. Le permite dibujar CircleShape en su monitor e imprimirlo en una hoja de papel con el mismo código, solo debe pasar las diferentes implementaciones de DrawingAPI. Sin embargo, si pasa DrawingAPI a Shape.draw() en lugar de pasarlo al constructor, sería más flexible porque entonces puede usar el mismo gráfico de objetos para el monitor y la impresora.

+1

Gracias, tengo una visión más clara del patrón ahora. después de google durante horas sobre el patrón, he encontrado un buen enlace para los patrones http://www.allappforum.com/java_design_patterns/creational_patterns.htm Hay un ejemplo simple sobre el patrón del puente. Hay una interfaz llamada Switch, y dos subclases se llaman Bulb y Fan, cada una de las subclases tiene su propia implementación para Switch. Un ejemplo agradable y simple. – user200340

0

La subclase CircleShape constructor toma 4 args, en su método draw(), los primeros 3 args se pasan al 4th arg que puede ser cualquier subclase de DrawingAPI. Entonces, ¿esto significa que usar un patrón de puente puede aumentar la flexibilidad? y hay más cosas que este ejemplo puede decirnos?

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

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

ShapeCircleShape y pueden cambiar de forma independiente, sin dependencia de DrawingAPI.

Usted puede encontrar más detalles sobre el patrón del puente por debajo de post SE, lo que explica distinta ejemplo:

Does the Bridge Pattern decouples an abstraction from implementation?

Cuestiones relacionadas