Bridge
Clasificación del patrón
Estructural
Intención
Desacoplar una abstracción de su implementación, de manera que ambas puedan ser modificadas independientemente sin necesidad de alterar por ello la otra.
También conocido como
Handle/Body
Motivación
Cuando una abstracción puede tener una de varias posibles implementaciones, es usual acomodar esto mediante el uso de herencia. Una clase abstracta define la interfaz de la abstracción, y subclases concretas implementan esto en diferentes formas. Sin embargo, este enfoque no es siempre lo suficientemente flexible. La herencia une una implementación con la abstracción permanentemente, lo que dificulta la modificación, extensión y rehusó de abstracciones e implementaciones independientemente.
El patrón Bridge maneja este problema colocando la abstracción y la implementación en jerarquías de clases separadas.
Aplicabilidad
Usamos el patrón Bridge cuando:
- Se quiere evitar una vinculación permanente entre una abstracción y su implementación. Este podría ser el caso, por ejemplo, cuando la implementación debe ser seleccionada en tiempo de ejecución.
- Tanto las abstracciones y sus implementaciones deben ser extensibles a subclases. En este caso, el patrón Bridge permite combinar las diferentes abstracciones e implementaciones y extenderlas de forma independiente.
- Cambios en la implementación de una abstracción no deben tener impacto sobre los clientes, es decir, que su código con tiene que ser recompilado.
- Se desea compartir una implementación entre múltiples objetos (quizá usando contadores), este hecho debe ser escondido a los clientes.
Estructura
Participantes
- Abstraction: define una interfaz abstracta. Mantiene una referencia a un objeto de tipo Implementor.
- RefinedAbstraction: Entiende la interfaz definida por Abstraction.
- Implementor: define la interfaz para la implementación de clases. Esta interface no se tiene que corresponder exactamente con la interfaz de Abstraction; de hecho, las dos interfaces pueden ser bastante diferente. Típicamente la interface Implementor provee sólo operaciones primitivas, y Abstraction define operaciones de alto nivel basadas en estas primitivas.
- ConcreteImplemetor: Implementa la interfaz Implementor y define su implementación concreta.
Colaboraciones
Abstraction remite las solicitudes de los clientes a su objeto Implementor.
Consecuencias
El patrón Bridge tiene las siguientes consecuencias:
- Desacopla la interfaz y la implementación Una implementación no está vinculada permanentemente con la interfaz. La implementación de una abstracción puede ser configurada en tiempo de ejecución.
Desacoplando la abstracción y la implementación también eliminamos dependencias en tiempo de compilación sobre la implementación. El cambio en la implementación de una clase no requiere recompilar la clase de abstracción y de sus clientes. Esta propiedad es esencial cuando se debe garantizar la compatibilidad binaria entre distintas versiones de una biblioteca de clases.
Además, este desacoplamiento crea capas que pueden llevar a un sistema mejor estructurado. El alto nivel de un sistema solo debe saber acerca de Abstraction y Implementor. - Mejora de extensibilidad Podemos extender las jerarquías de Abstraction y de Implementor independientemente.
- Esconde detalles de la implementación a los clientes.
Implementación
Cómo, cuándo y dónde se elige la implementación a utilizar
- El constructor de la abstracción, por ejemplo a partir de información pasada como parámetro.
- Elegir una implementación por defecto que puede cambiar en tiempo de ejecución.
- Utilizar una factoría abstracta a la que la abstracción solicita implementaciones.
En C++ se puede usar herencia múltiple (pública de la abstracción y privada de la implementación), aunque esto no es un verdadero Bridge ya que el vínculo entre abstracción e implementación es estático.
Una forma degenerada de Bridge es la construcción Handle/Body donde se usa el patrón para que distintos objetos compartan una misma representación (por ejemplo cadenas estáticas), body, a través de un handle que gestiona el conteo de referencias
Usos Conocidos
- El AppKit de NeXT usa un Bridge en la visualización de diferentes tipos de imágenes.
- El DOM de KDE3 está basado en un bridge (Junto con otros patrones). Permite crear diferentes tipos de documentos usando la misma abstracción.
Patrones relacionados
Un Abstract Factory puede crear y configurar un Bridge particular.
Referencias Bibliográficas
http://www.postgradoinformatica.edu.bo/enlaces/investigacion/pdf/INGSW3_42.pdf?PHPSESSID=3ab62098bf2d8aae88430bb18791f9ac
http://gaia.fdi.ucm.es/people/pedro/das03/14bridge.pdf
No hay comentarios:
Publicar un comentario