Bridge

1 Sinopsis

Desacopla la abstraccion de su implantancion de tal manera que es posible que varien de manera independiente

2 Contexto

Supongase que se necesita desacoplar una Abstraccion con respecto a una Implantacion, debido a que se necesita sustituir diferentes Implantaciones para una Abstraccion dada sin causar ningun impacto en un Cliente que llama.

3 Solucion

Se realiza proporcionando una clase Abstraccion que delega la implantacion de sus servicios a una interfaz Implandora, la cual es refinada por una jerarquia de Implantadoras concretas El diagrama UML es el siguiente:

4 Consecuencias

Se oculta o encapsula los detalles de la implantacion al cliente Se logra un acoplamiento debil gracias a que se separa la interfase de la implantacion Se pueden crear jerarquias independientes de interfases e implantaciones

5 Ejemplo

Se tiene una jerarquia de Lectores


public class Lector  {
    ....
}
See the complete code for Lector here.
            private LectorImplIF imp= new LectorPrueba();
            public String leer(){
              return imp.trabajar();
            }
              
        

public class LectorRemoto extends Lector  {
    ....
}
See the complete code for LectorRemoto here.
           private LectorRemotoImplIF imp= new LectorHTTP();
           public String leer(){
             imp.extraer();
             return imp.trabajar();
           } 
        

Y una jerarquia de interfases que pueden utilizarse para implantar al sistema de lectores


public interface LectorImplIF  {
    ....
}
See the complete code for LectorImplIF here.
public String trabajar();

public interface LectorRemotoImplIF  {
    ....
}
See the complete code for LectorRemotoImplIF here.
           public void extraer();      
           public String trabajar();

Las clases que implantan a las interfases son las siguientes


public class LectorPrueba implements LectorImplIF  {
    ....
}
See the complete code for LectorPrueba here.
          private String cadena="Hola Bridge";
          public String trabajar() {
            return cadena;
          }
        

public class LectorPrueba2 implements LectorImplIF  {
    ....
}
See the complete code for LectorPrueba2 here.
          private String cadena="Hola Bridge";
          public String trabajar() {
            return cadena.toUpperCase();
          }
       

public class LectorHTTP implements LectorRemotoImplIF  {
    ....
}
See the complete code for LectorHTTP here.
          private String cadena;
          private String url;
          public String trabajar() {
            return cadena;
          }
          public void extraer() {
          
          }
        

Y el codigo del cliente, utiliza la clase Lector, ya sea para hacer pruebas de concepto o para usar una implantacion con un sistema real


public class ClienteBridge  {
    ....
}
See the complete code for ClienteBridge here.
          public static void main(String [] args) {
             Lector lect=null ;
             
             if (args[0].equals("T") ) {
                 lect = new Lector();
             } else if (args[0].equals("R") ){
                 lect = new LectorRemoto();
             }
             if (lect!=null) {
                System.out.println(lect.leer());
             }
          }