Puente es un patrón de diseño estructural que te permite dividir una clase grande o un conjunto de clases estrechamente relacionadas en dos jerarquías separadas (abstracción e implementación), que se pueden desarrollar de forma independiente.

¿Qué problema resuelve el patrón puente?

Imagínate que tienes una clase geométrica Form con un par de subclases: Circle y Square. Tu nueva idea es extender esta jerarquía de clases para incorporar colores, y piensas en crear subclases de formas amarillas y verdes. Pero, como ya tienes dos subclases, deberás crear cuatro combinaciones de clases, por ejemplo, YellowCircle y GreenSquare.

Supongo que ya ves el problema, agregar nuevos tipos de formas y colores a la jerarquía la hará crecer exponencialmente. Añadir una forma nueva te obliga a introducir dos subclases, una para cada color. Un color nuevo te obligaría a crear tres subclases, una para cada tipo de forma, y así sucesivamente.

El patrón Puente intenta resolver este problema pasando de la herencia a la composición del objeto. Es decir, extrae una de las dimensiones en una jerarquía de clases separada, para que las clases originales hagan referencia a un objeto de la nueva jerarquía, en vez de tener todo su estado y comportamiento dentro de una clase.

Con este enfoque, puedes extraer el código relacionado con el color en su propia clase con dos subclases: amarillo y verde. Después, la clase Shape obtiene un campo de referencia que apunta a uno de los objetos de color.

A partir de este momento la forma puede delegar cualquier trabajo relacionado con el color al objeto de color vinculado. Esa referencia actúa como puente entre Form y Color. Ya no se cambiará la jerarquía de formas al agregar nuevos colores.

¿Cuándo usar el patrón Puente (Bridge)?

Podrías usar el patrón Puente cuando quieras dividir y organizar una clase monolítica que tenga varias variantes de alguna funcionalidad. Eso puede ser interesante, por ejemplo, para descubrir cómo funciona una clase y hacer un cambio de forma más rápida. Este patrón te permite dividir la clase monolítica en varias jerarquías de clases.

También podrías usar el patrón Bridge cuando necesites extender una clase en varias dimensiones ortogonales. Puente sugiere que extraigas una jerarquía de clases separadas para cada una de las dimensiones. La clase original delega el trabajo relacionado a los objetos que pertenecen a esas jerarquías en lugar de hacerlo todo por su cuenta.

Por último, podrías usar el Puente si necesitas poder cambiar implementaciones en tiempo de ejecución. Este patrón te permite reemplazar el objeto de implementación dentro de la abstracción asignando un nuevo valor a un campo.

Pros y contras del patrón puente

Los siguientes son algunos de los “pros y cons” de este patrón:

Pros

Contras

  • Puedes crear clases y aplicaciones independientes de la plataforma

  • El código del cliente trabaja con abstracciones de alto nivel

  • Principio abierto/cerrado. Puedes introducir nuevas abstracciones e implementaciones independientemente unas de otras

  • Principio de responsabilidad única. Puedes centrarte en la lógica de alto nivel en la abstracción y en los detalles de la plataforma en la implementación. 

  • Puedes hacer que el código sea más complicado aplicando el patrón a una clase altamente cohesiva. 

“Show me the code”

Si quieres saber cómo se ve el patrón puente, puedes ver el ejemplo en PHP de refactoring.guru.

En el ejemplo del “mundo real” verás cómo, con el patrón puente, la jerarquía de Page actúa como la abstracción y la jerarquía del renderizador actúa como la implementación. Verás, por tanto, que los objetos de clase Page pueden ensamblar páginas web de un tipo particular utilizando elementos básicos proporcionados por un objeto Renderer adjunto a esa página.

Ambas jerarquías de clases están separadas, por eso puedes agregar una nueva clase Renderer sin cambiar ninguna de las clases de página y viceversa.

¿Utilizas el patrón Bridge en tus proyectos? ¿Qué tal la experiencia? ¡Coméntalo abajo!

Fuente:

Compartir es construir