c# - resuelven - Puente contra patrón de diseño del adaptador
patrones de diseño y cuando usarlos (3)
Creo que no tienes un patrón de GoF puro aquí. Es algo entre el decorador y el adaptador. Está cambiando la interfaz del cliente de servicio (adaptándolo a sus necesidades). Pero también está agregando nuevas responsabilidades al cliente (registro y manejo de errores) - eso es una parte decorativa. Si te quedas con la interfaz de servicio original, sería puro decorador.
ACTUALIZACIÓN: cualquier uso de la herencia no significa que estemos usando algún patrón de GoF. Hay varias cosas que le falta a su arquitectura actual para ser Bridge:
- Jerarquía de implementaciones. Su interfaz de servicio debe definir algunas operaciones de bajo nivel. Y deberías tener varias implementaciones de servicio.
- La abstracción debe definir la interfaz de alto nivel. Por lo general, esas interfaces no se parecen a la interfaz de implementación (su interfaz de cliente es similar a la interfaz de servicio, existe en el mismo nivel de abstracción).
- Las implementaciones de abstracción deben usar la interfaz de servicio para implementar operaciones de alto nivel (es decir, no agregan algunas responsabilidades al servicio, implementan cosas diferentes, cosas de alto nivel).
Un colega me interrogó sobre el patrón de diseño de mi implementación de un servicio de ventanas WCF en una aplicación cliente de ASP.net y ¡realmente no podía decir si es Bridge o Adapter !
Aquí está la implementación:
- He obtenido el contrato de servicio
- Definí una nueva interfaz similar a mi contrato de datos WCF
- Creé un cliente WCF y lo envolví dentro de la nueva interfaz
- Asignó las nuevas operaciones de interfaz al cliente de WCF original (aquí hago algunos registros / manejo de errores)
Siempre lo pensé como una implementación del patrón de Adaptador , pero realmente no puedo decir por qué no es Bridge .
He leído todas las publicaciones aquí en SO, GoF y wikipedia, ¡pero realmente no tiene sentido!
Según tengo entendido, ambos patrones apuntan a un tipo existente , ambos desacoplan una abstracción de su implementación. ¿Me falta un punto?
Aquí está de GoF:
La diferencia clave entre estos patrones radica en sus intenciones. El adaptador se enfoca en resolver incompatibilidades entre dos interfaces existentes. No se centra en cómo se implementan esas interfaces, ni considera cómo podrían evolucionar de forma independiente. Es una forma de hacer que dos clases diseñadas independientemente trabajen juntas sin reimplementar una u otra. El puente, por otro lado, une una abstracción y sus implementaciones (potencialmente numerosas). Proporciona una interfaz estable para los clientes incluso cuando le permite variar las clases que la implementan. También acomoda nuevas implementaciones a medida que el sistema evoluciona.
No entiendo completamente la declaración anterior,
- ¿Significa que si varío el adaptador o modifico la implementación de la interfaz original en el momento del diseño, es un patrón de puente ?
- Las diferencias suenan triviales, ¿hay otras diferencias en la implementación / abstención?
- ¿Cómo puede alguien decir qué implementación se usa después del desarrollo?
- ¿Puede alguien darme un buen ejemplo de patrón de puente y cómo se puede cambiar durante el ciclo de vida del software?
Actualizar:
De nuevo de GoF:
Recuerde que un adaptador hace que dos interfaces existentes trabajen juntas en lugar de definir una completamente nueva.
¿Significa que cambiar la interfaz existente para que pueda funcionar con otra interfaz es una implementación de Adapter ?
Actualización2:
Acabo de encontrar este increíble artículo: Patrones de diseño de GOF ilustrados en C #
Esta es la verdadera estructura del patrón de puente:
Me faltaba el hecho de que el patrón de Bridge le permite combinar las diferentes abstracciones e implementaciones y extenderlas de forma independiente
Esto se ha discutido anteriormente aquí - Diferencia entre el patrón de puente y el patrón de adaptador - La verdadera cita que desea de GoF es "El adaptador hace que las cosas funcionen una vez que están diseñadas; Bridge las hace funcionar antes que ellas. [GoF, p219]
Su última pregunta obtiene un sí: se usa un adaptador para hacer que dos elementos, por lo demás, desagradables de un sistema, funcionen muy bien juntos sin cambiar su funcionalidad fundamental más allá de la posibilidad de subcontratar la unión de sus funcionalidades.
Un patrón de puente se usa generalmente para tratar problemas en el diseño inicial donde el modelo mental presentado al consumidor podría ser muy diferente del modelo que realiza la implementación del modelo de los consumidores. Considere una biblioteca matemática de alto rendimiento que se ve igual en una amplia variedad de procesadores: solo desea multiplicar matrices, pero detrás de la escena hay todo tipo de cruces que involucran swizzling, flujos de datos paralelos, comportamientos extraños para evitar atascos en las tuberías y todo. de manera diferente en más de 3 realizaciones de un núcleo superscaler de alto rendimiento, y eso es solo Intel :-(
Me explicaron el patrón de puente como una intención de combinar dos jerarquías de clase con diferentes propósitos. Por ejemplo, considere que está escribiendo un marco de ventana con diferentes tipos de controles y soporte para diferentes sistemas de ventanas. Tendría un árbol de clases para los controles y otro para abstraer las diferencias entre los sistemas de ventanas. Ahora, si desea agregar soporte para otro sistema de ventanas, simplemente agregue eso a ese lado de la jerarquía, y si desea agregar nuevos controles, los agrega a su lado. El "puente" existe entre las clases superiores de las dos jerarquías, donde su clase de control tiene acceso a las funciones abstractas definidas por la clase base de la jerarquía de clases que implementa el soporte para los diversos sistemas de ventanas.
Con el patrón de adaptador no desea combinar dos jerarquías de clases con diferentes intenciones, sino adaptar una clase para que funcione con su propia interfaz. Supongo que si solo admite un sistema de ventana única en el ejemplo anterior y no coloca una clase abstracta entre los dos para mantener la extensibilidad, eso sería un adaptador en lugar de un puente.