Patrones de Diseño - Patron Bridge/ Puente - ¿Que es el Patrón de Diseño Bridge?

Hola! Seguimos en el mundo de los patrones, estoy a un punto que cada patrón me parece demasiado parecido a otro, lo cual me hace sentarme y aprender mas y mas, hoy vamos a ver al patrón bridge o puente.

Patrones de Diseño - ¿Que es el Patrón de Diseño Bridge?

El patrón de diseño bridge simplemente nos permite separar abstracción de su implementación.


Diagrama UML


Abstraccion: Define una interfaz abstracta. Mantiene una referencia a un objeto tipo Implementor.
RefinedAbstraccion: Extiende la interfaz definida por Abstraccion.
Implementor: Define la interface para la implementación de clases. Esta interface no se tiene que corresponder exactamente con la interface de Abstraccion; de hecho, las dos interfaces pueden ser bastante diferentes.
ConcreteImplementor: Implementa la interface de Implementor y define su implementación concreta

Nombre del patrón:
Bridge o Puente

Clasificación del Patrón:
Estructural

Intención:
Disociar una abstracción de su aplicación, de manera que los dos pueden variar independientemente.
Publicar una interfaz en la jerarquía de herencia, y insertar en su propia aplicación herencia jerarquía.

Motivación:
Desacoplar una abstracción de su implementación. La Herencia liga una implementación a una abstracción dificultando la modificación, extensión y reutilización.

Ejemplo:
Problema: 
10/10/2014 - Usuario: "Necesito un aplicación que dibuje circulos negros".

Bueno entonces hacemos el diagrama correspondiente:


Patrones de Diseño - Patron Bridge/ Puente - ¿Que es el Patrón de Diseño Bridge?

11/10/2014 - Usuario: "Necesito que la aplicación también dibuje rectángulos negros".

Ya vemos que hay una Herencia de por medio y descubrimos que heredan el método dibujar.

Patrones de Diseño - Patron Bridge/ Puente - ¿Que es el Patrón de Diseño Bridge?


14/10/2014 - Usuario: "Necesito que la aplicación ahora también permita dibujar en color rojo."

Ahora en la Herencia nos damos cuenta que tenemos que escribir la super clase y también volver a modificar las subclases.

Patrones de Diseño - Patron Bridge/ Puente - ¿Que es el Patrón de Diseño Bridge?

Y así sucesivamente  por cada nuevo método que quieran agregar lo cual es horrible por que tenemos que modificar super y subclase por cada modificación.

Solución:

La solución es básicamente sencilla realizamos una clase base abstracta para las figuras y luego la interfase con los métodos que se van a comenzar a duplicar y/o extender. La magia de esto es que la abstracta posee una propiedad del tipo IColor, lo cual cualquier clase que implemente de ella va a ser posible utilizar sus métodos.

Patrones de Diseño - Patron Bridge/ Puente - ¿Que es el Patrón de Diseño Bridge?


AbstractFigura
package ar.com.patronesdisenio.bridge.main;
import ar.com.patronesdisenio.bridge.interfaces.IColor;

/**
* @author nconde
*/
public abstract class AbstractFigura {

protected IColor icolor;

/**
* <p>Constructor<p>
* @param icolor
*/
public AbstractFigura(IColor icolor){
this.icolor = icolor;
}
public abstract void dibujar();
}



IColor
package ar.com.patronesdisenio.bridge.interfaces;

/**
* @author nconde
*/
public interface IColor {
public void pintar();
}



Circulo
package ar.com.patronesdisenio.bridge.imp;
import ar.com.patronesdisenio.bridge.interfaces.IColor;
import ar.com.patronesdisenio.bridge.main.AbstractFigura;

/**
* @author nconde
*/
public class Circulo extends AbstractFigura {

public Circulo(IColor icolor) {
super(icolor);
}

@Override
public void dibujar() {
System.out.println("Dibujando...");
icolor.pintar();
}
}



Rectangulo
package ar.com.patronesdisenio.bridge.imp;
import ar.com.patronesdisenio.bridge.interfaces.IColor;
import ar.com.patronesdisenio.bridge.main.AbstractFigura;

/**
* @author nconde
*/
public class Rectangulo extends AbstractFigura {


public Rectangulo(IColor icolor) {
super(icolor);
}

@Override
public void dibujar() {
System.out.println("Dibujando...");
icolor.pintar();
}

}



Negro
package ar.com.patronesdisenio.bridge.interfaces.imp;
import ar.com.patronesdisenio.bridge.interfaces.IColor;

/**
* @author nconde
*/
public class Negro implements IColor{

@Override
public void pintar() {
System.out.println("Color Negro");
}
}



Rojo
package ar.com.patronesdisenio.bridge.interfaces.imp;
import ar.com.patronesdisenio.bridge.interfaces.IColor;

/**
* @author nconde
*/
public class Rojo implements IColor{

@Override
public void pintar() {
System.out.println("Color Rojo");
}
}



BridgeMain
package ar.com.patronesdisenio.bridge.main;
import ar.com.patronesdisenio.bridge.imp.Circulo;
import ar.com.patronesdisenio.bridge.interfaces.imp.Negro;
import ar.com.patronesdisenio.bridge.interfaces.imp.Rojo;

/**
* @author nconde
*/
public class BridgeMain {

public static void main(String[] args) {

AbstractFigura af = new Circulo(new Negro());
af.dibujar();
af.icolor = new Rojo();
af.dibujar();
}
}


Amigos espero que les allá quedado claro por cualquier duda avisen y se las respondemos!
Patrones de Diseño - Patron Bridge/ Puente - ¿Que es el Patrón de Diseño Bridge? Patrones de Diseño - Patron Bridge/ Puente - ¿Que es el Patrón de Diseño Bridge? Reviewed by El lado oscuro de java on octubre 15, 2014 Rating: 5

1 comentario:

  1. felicidade buenos datos!!
    queria saber si tiene ejemplo sobre el patron de estrategia (strategy) y inyeccion de dependencia

    ResponderEliminar

Con la tecnología de Blogger.