¿Alguien ha usado el patrón de puente en una aplicación del mundo real? Si es así, ¿cómo lo usaste? ¿Soy yo, o es solo el Patrón Adaptador con una pequeña inyección de dependencia en la mezcla? ¿Realmente merece su propio patrón?
design-patterns
adapter
bridge
Charles Graham
fuente
fuente
Respuestas:
Un ejemplo clásico del patrón Bridge se utiliza en la definición de formas en un entorno de interfaz de usuario (consulte la entrada de Wikipedia del patrón Bridge ). El patrón Puente es un compuesto de los patrones de Plantilla y Estrategia .
Es una vista común algunos aspectos del patrón Adaptador en el patrón Puente. Sin embargo, para citar este artículo :
fuente
Hay una combinación de las respuestas de Federico y John .
Cuando:
Refactorizar a:
fuente
El patrón Bridge es una aplicación del antiguo consejo, "prefiera la composición a la herencia". Se vuelve útil cuando debe subclasificar diferentes tiempos de manera ortogonal entre sí. Digamos que debe implementar una jerarquía de formas de colores. No subclase Forma con Rectángulo y Círculo y luego subclase Rectángulo con Rectángulo Rojo, Rectángulo Azul y Rectángulo Verde y lo mismo para Círculo, ¿verdad? Preferiría decir que cada Forma tiene un Color e implementar una jerarquía de colores, y ese es el Patrón de Puente. Bueno, no implementaría una "jerarquía de colores", pero se entiende la idea ...
fuente
Cuando:
Refactorizar a:
fuente
El adaptador y el puente están ciertamente relacionados, y la distinción es sutil. Es probable que algunas personas que piensan que están usando uno de estos patrones realmente estén usando el otro patrón.
La explicación que he visto es que Adaptador se usa cuando intentas unificar las interfaces de algunas clases incompatibles que ya existen . El Adaptador funciona como una especie de traductor de implementaciones que podrían considerarse heredadas .
Mientras que el patrón Bridge se usa para código que es más probable que sea greenfield. Está diseñando el puente para proporcionar una interfaz abstracta para una implementación que debe variar, pero también define la interfaz de esas clases de implementación.
Los controladores de dispositivos son un ejemplo citado a menudo de Bridge, pero yo diría que es un Bridge si está definiendo las especificaciones de la interfaz para los proveedores de dispositivos, pero es un Adaptador si está tomando controladores de dispositivos existentes y haciendo una clase envolvente para Proporcionar una interfaz unificada.
Entonces, en cuanto al código, los dos patrones son muy similares. En cuanto a los negocios, son diferentes.
Ver también http://c2.com/cgi/wiki?BridgePattern
fuente
En mi experiencia, Bridge es un patrón recurrente bastante frecuente, porque es la solución siempre que haya dos dimensiones ortogonales en el dominio . Por ejemplo, formas y métodos de dibujo, comportamientos y plataformas, formatos de archivo y serializadores, etc.
Y un consejo: siempre piense en los patrones de diseño desde la perspectiva conceptual , no desde la perspectiva de implementación. Desde el punto de vista correcto, Bridge no se puede confundir con Adapter, porque resuelven un problema diferente, y la composición es superior a la herencia, no por sí misma, sino porque permite manejar las preocupaciones ortogonales por separado.
fuente
La intención de Bridge and Adapter es diferente y necesitamos ambos patrones por separado.
Patrón de puente:
Use el patrón Puente cuando:
La respuesta de @ John Sonmez muestra claramente la efectividad del patrón de puente para reducir la jerarquía de clases.
Puede consultar el siguiente enlace de documentación para obtener una mejor visión del patrón del puente con un ejemplo de código
Patrón adaptador :
Diferencias clave
Pregunta SE relacionada con el diagrama UML y el código de trabajo:
Diferencia entre patrón de puente y patrón de adaptador
Artículos utiles:
artículo de patrón de puente de creación de fuente
artículo de patrón de adaptador de creación de fuente
artículo del patrón del puente journaldev
EDITAR:
Ejemplo del mundo real del patrón de puente (según la sugerencia de meta.stackoverflow.com, ejemplo de sitio de documentación incorporado en esta publicación ya que la documentación se pondrá al sol)
El patrón de puente desacopla la abstracción de la implementación para que ambos puedan variar de forma independiente. Se ha logrado con la composición en lugar de la herencia.
Patrón de puente UML de Wikipedia:
Tienes cuatro componentes en este patrón.
Abstraction
: Define una interfazRefinedAbstraction
: Implementa la abstracción:Implementor
: Define una interfaz para la implementaciónConcreteImplementor
: Implementa la interfaz del Implementador.The crux of Bridge pattern :
Dos jerarquías de clases ortogonales que usan composición (y no herencia). La jerarquía de abstracción y la jerarquía de implementación pueden variar de forma independiente. La implementación nunca se refiere a la abstracción. Abstracción contiene la interfaz de implementación como miembro (a través de la composición). Esta composición reduce un nivel más de jerarquía de herencia.Caso de uso de palabras reales:
Permita que diferentes vehículos tengan ambas versiones del sistema de engranaje manual y automático.
Código de ejemplo:
salida:
Explicación:
Vehicle
Es una abstracción.Car
yTruck
son dos implementaciones concretas deVehicle
.Vehicle
define un método abstracto:addGear()
.Gear
es la interfaz del implementadorManualGear
yAutoGear
son dos implementaciones deGear
Vehicle
contieneimplementor
interfaz en lugar de implementar la interfaz.Compositon
La interfaz del implementador es crucial para este patrón: permite que la abstracción y la implementación varíen independientemente.Car
yTruck
defina la implementación (abstracción redefinida) para la abstracción::addGear()
ContieneGear
- OManual
bienAuto
Caso (s) de uso para el patrón de puente :
fuente
He usado el patrón de puente en el trabajo. Programo en C ++, donde a menudo se le llama modismo PIMPL (puntero a la implementación). Se parece a esto:
En este ejemplo
class A
contiene la interfaz yclass Aimpl
contiene la implementación.Un uso para este patrón es exponer solo algunos de los miembros públicos de la clase de implementación, pero no otros. En el ejemplo solo
Aimpl::foo()
se puede llamar a través de la interfaz pública deA
, pero noAimpl::bar()
Otra ventaja es que puede definir
Aimpl
en un archivo de encabezado separado que no necesita ser incluido por los usuarios deA
. Todo lo que tiene que hacer es utilizar una declaración directa deAimpl
antes deA
definir, y mover las definiciones de todas las funciones miembro que hacen referenciapImpl
al archivo .cpp. Esto le brinda la capacidad de mantener elAimpl
encabezado privado y reducir el tiempo de compilación.fuente
Para poner un ejemplo de forma en el código:
El resultado es:
Tenga en cuenta la facilidad con la que se pueden agregar nuevos colores y formas al sistema sin provocar una explosión de subclases debido a permutaciones.
fuente
Para mí, lo considero un mecanismo en el que puedes intercambiar interfaces. En el mundo real, es posible que tenga una clase que pueda usar más de una interfaz, Bridge le permite intercambiar.
fuente
Está trabajando para una compañía de seguros donde desarrolla una aplicación de flujo de trabajo que gestiona diferentes tipos de tareas: contabilidad, contrato, reclamos. Esta es la abstracción. En el lado de la implementación, debe poder crear tareas de diferentes fuentes: correo electrónico, fax, mensajería electrónica.
Comienzas tu diseño con estas clases:
Ahora, dado que cada fuente debe manejarse de una manera específica, usted decide especializar cada tipo de tarea:
Terminas con 13 clases. Agregar un tipo de tarea o un tipo de fuente se convierte en un desafío. El uso del patrón de puente produce algo más fácil de mantener al desacoplar la tarea (la abstracción) de la fuente (que es un problema de implementación):
Agregar un tipo de tarea o una fuente ahora es mucho más fácil.
Nota: La mayoría de los desarrolladores no crearían la jerarquía de 13 clases por adelantado para manejar este problema. Sin embargo, en la vida real, es posible que no sepa de antemano el número de fuentes y tipos de tareas; Si solo tiene una fuente y dos tipos de tareas, probablemente no desacoplaría la Tarea de la Fuente. Luego, la complejidad general crece a medida que se agregan nuevas fuentes y tipos de tareas. En algún momento, refactorizará y, con mayor frecuencia, terminará con una solución similar a un puente.
fuente
fuente