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:
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.
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.
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.
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!





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