Anda di halaman 1dari 4

Bridge (patrn de diseo)

El patrn Bridge, tambin conocido como Handle/Body, es una tcnica usada en programacin para desacoplar una abstraccin de su implementacin, de manera que ambas puedan ser modificadas independientemente sin necesidad de alterar por ello la otra. Esto es, se desacopla una abstraccin de su implementacin para que puedan variar independientemente.

Contenido
[ocultar]

1 Aplicabilidad 2 Estructura 3 Participantes 4 Colaboraciones 5 Consecuencias 6 Implementacin 7 Cdigo en java

[editar] Aplicabilidad
Se usa el patrn Bridge cuando:

Se desea evitar un enlace permanente entre la abstraccin y su implementacin. Esto puede ser debido a que la implementacin debe ser seleccionada o cambiada en tiempo de ejecucin. Tanto las abstracciones como sus implementaciones deben ser extensibles por medio de subclases. En este caso, el patrn Bridge permite combinar abstracciones e implementaciones diferentes y extenderlas independientemente. Cambios en la implementacin de una abstraccin no deben impactar en los clientes, es decir, su cdigo no debe tener que ser recompilado. (En C++) Se desea esconder la implementacin de una abstraccin completamente a los clientes. En C++, la representacin de una clase es visible en la interface de la clase. Se desea compartir una implementacin entre mltiples objetos (quiz usando contadores), y este hecho debe ser escondido a los clientes.

[editar] Estructura

[editar] Participantes

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 implementacin de clases. Esta interface no se tiene que corresponder exactamente con la interface de Abstraction; de hecho, las dos interfaces pueden ser bastante diferente. Tpicamente la interface Implementor provee slo operaciones primitivas, y Abstraction define operaciones de alto nivel basadas en estas primitivas. ConcreteImplementor implementa la interface de Implementor y define su implementacin concreta.

[editar] Colaboraciones

Abstraction emite los pedidos de los clientes a su objeto Implementor.

[editar] Consecuencias

1.Desacopla interface e implementacin: una implementacin no es limitada permanentemente a una interface. La implementacin de una abstraccin puede ser configurada en tiempo de ejecucin. Adems le es posible a un objeto cambiar su implementacin en tiempo de ejecucin. Desacoplando Abstraction e Implementor tambin elimina las dependencias sobre la implementacin en tiempo de compilacin. Cambiar una clase de implementacin no require recompilar la clase Abstraction ni sus clientes. Esta propiedad es esencial cuando te debes asegurar la compatibilidad binaria entre diferentes versiones de una biblioteca de clases. Es ms, este desacoplamiento fomenta las capas, que pueden conducir a un sistema

mejor estructurado. La parte de alto nivel de un sistema slo tiene que conocer Abstraction e Implementor. 2.Mejora la extensibilidad: se puede extender las jerarquas de Abstraction e Implementor independientemente. 3.Esconde los detalles de la implementacin a los clientes.

[editar] Implementacin
Consideremos las siguientes cuestiones de implementacin cuando se aplica este patrn:

1.Slo un Implementor: en situaciones donde existe slo una implementacin, crear una clase Implementor abstracta no es necesario. Esto es un caso especial del patrn; hay una relacin uno-a-uno entre Abstraction e Implementor. Sin embargo, esta separacin es an muy til cuando un cambio en la implementacin de una clase no debe afectar a sus clientes existente, es decir, ellos no deben ser recompilados, slo relinkeados. En C++, la interface de la clase Implementor puede ser definida en un archivo header privado el cual no es provedo a los clientes. Esto permite esconder una implementacin de una clase completamente de sus clientes. 2 Creando el objeto Implementor adecuado: Cmo, cundo y dnde que clase Implementor instanciar cuando hay ms de una?Si Abstraction conoce todas las clases ConcreteImplementor puede instanciar una de ellas en su constructor; puede decidir cul instanciar dependiendo de los parmetros del constructor.

Otra aproximacin es elegir una implementacin inicial por defecto y cambiarla despus acorde al uso. Tambin es posible delegar la decisin a otro objeto en conjunto.

3 Compartiendo implementadores: el estilo Handle/Body en C++ puede ser usado para compartir implementaciones de muchos objetos. Body almacena una cuenta de referencia que la clase Handle incrementa y decrementa. 4 Usando herencia mltiple. Se puede usar herencia mltiple en C++ para asociar una interfaz con su implementacin.

Creamos una clase Abstraccin padre que sea abstracta, adems de abstracciones concretas mediante clases que heredan de ella. Por otro lado se tienen las clases que implementan la funcionalidad con una estructura similar: una clase ImplementacinAbstracta padre, y todas las clases hijas necesarias que implementan la funcionalidad de todas las maneras necesarias. La relacin se da entre la clase abstracta Abstraccin y la clase abstracta Implementacin, delegando la primera la implementacin en la segunda, que a su vez la delega en las implementaciones concretas.

[editar] Cdigo en java


/** interfaz que implementan los implementadores especificos **/ public interface Implementador { public abstract void operacion(); }

/** primera implementacion de Implementador **/ public class ImplementacionA implements Implementador{ public void operacion() { System.out.println("Esta es la implementacion A"); } } /** segunda implementacion de Implementador **/ public class ImplementacionB implements Implementador{ public void operacion() { System.out.println("Esta es una implementacion de B"); } } /** interfaz de abstraccin **/ public interface Abstraccion { public void operacion(); } /** clase refinada que implementa la abstraccion **/ public class AbstraccionRefinada implements Abstraccion{ private Implementador implementador; public AbstraccionRefinada(Implementador implementador){ this.implementador = implementador; } public void operacion(){ implementador.operacion(); } } /** aplicacion que usa el patrn Bridge **/ public class EjemploBridge { public static void main(String[] args) { Abstraccion[] abstracciones = new Abstraccion[2]; abstracciones[0] = new AbstraccionRefinada(new ImplementacionA()); abstracciones[1] = new AbstraccionRefinada(new ImplementacionB()); for(Abstraccion abstraccion:abstracciones) abstraccion.operacion(); } }

Anda mungkin juga menyukai