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:
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!
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:
felicidade buenos datos!!
ResponderEliminarqueria saber si tiene ejemplo sobre el patron de estrategia (strategy) y inyeccion de dependencia