Páginas

miércoles, 15 de octubre de 2014

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!

1 comentario:

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

    ResponderEliminar