Patrón Bridge:
Ejemplo dibujando punteado y normal
Este patrón permite modificar las implementaciones de una abstracción en tiempo de ejecución. Básicamente es una técnica usada en programación para desacoplar la interface de una clase de su implementación, de manera que ambas puedan ser modificadas independientemente sin necesidad de alterar por ello la otra.Este patrón debe ser utilizado cuando:
- Se desea evitar un enlace permanente entre la abstracción y su implementación. Esto puede ser debido a que la implementación debe ser seleccionada o cambiada en tiempo de ejecución.
- Tanto las abstracciones como sus implementaciones deben ser extensibles por medio de subclases. En este caso, el patrón Bridge permite combinar abstracciones e implementaciones diferentes y extenderlas independientemente.
- Cambios en la implementación de una abstracción no deben impactar en los clientes, es decir, su código no debe tener que ser recompilado.
- Se desea compartir una implementación entre múltiples y este hecho debe ser escondido a los clientes.
- Permite simplificar jerarquías demasiado pobladas.
Consecuencias
- Desacopla interface e implementación: una implementación no es limitada permanentemente a una interface. Le es posible a un objeto cambiar su implementación en tiempo de ejecución. Este desacoplamiento fomenta las capas, que pueden conducir a un sistema mejor estructurado.
- La parte de alto nivel de un sistema sólo tiene que conocer Abstraction e Implementor.
- Mejora la extensibilidad: se puede extender las jerarquías de Abstraction e Implementor independientemente.
- Esconde los detalles de la implementación a los clientes
Diagrama UML:
Abstraction: define una interface abstracta. Mantiene una referencia a un objeto de tipo Implementor.
RefinedAbstraction: extiende la interface definida por Abstraction
Implementor: define la interface para la implementación de clases. Esta interface no se tiene que corresponder exactamente con la interface de Abstraction; de hecho, las dos interfaces pueden ser bastante diferentes entre sí. Típicamente la interface Implementor provee sólo operaciones primitivas, y Abstraction define operaciones de alto nivel basadas en estas primitivas.
ImplementadorConcreto: implementa la interface de Implementor y define su implementación concreta.
Abstraction emite los pedidos de los clientes a su objeto Implementor. El cliente no tiene que conocer los detalles de la implementación.
Ejemplo:
Imaginemos que necesitamos dibujar distintas figuras geométricas (círculo, rectángulo, etc). Cada figura geométrica puede ser dibujada con diferentes tipos de líneas (normal, punteada, etc).
Vamos a combinar las clases de tal forma que tanto un Círculo como un Rectángulo sepan como dibujarse de manera abstracta, pero le dejaremos la implementación a un especialista en dibujo.
Esquema de clases:
Partimos de las Clases especialistas en dibujar:
Clase Dibujo:
->
Clase DibujoNormal:
->
Clases DibujoPunteado:
->
Definimos la clase Forma, de donde heredan las de Circulo y Rectangulo.
Las clases Círculo y Rectángulo sabrán como dibujarse pero de manera abstracta.
- Clase Forma
->
-Clase Circulo
->
-Clase Rectangulo
->
Programa principal:
->
Pantallazo de la aplicación ejecutándose:
Enlace de descarga del código fuente: enlace a box
fuente:
http://migranitodejava.blogspot.com.es/search/label/Bridge