Pregunta

¿Cuál es la diferencia entre los patrones Bridge y Adapter?

¿Fue útil?

Solución

  

" El adaptador hace que las cosas funcionen después de que están diseñadas; El puente los hace   trabajar antes que ellos. [GoF, p219] "

Efectivamente, el patrón Adaptador es útil cuando tiene un código existente, ya sea de terceros o interno, pero está fuera de su control, o de otra manera no se puede cambiar para cumplir con la interfaz que necesita a eso. Por ejemplo, tenemos un SuperWeaponsArray que puede controlar una buena variedad de dispositivos del día del juicio final.

public class SuperWeaponsArray {
  /*...*/

  public void destroyWorld() {
    for (Weapon w : armedWeapons) {
      w.fire();
    }
  }
}

Genial. Excepto que nos damos cuenta de que tenemos un dispositivo nuclear en nuestro arsenal que es muy anterior a la conversión a la interfaz de Arma. Pero realmente nos gustaría que funcionara aquí ... así que, ¿qué hacemos ... encajarlo?

NukeWeaponsAdaptor - basado fuera de nuestra clase Nuke, pero exportando la interfaz de Arma. Dulce, ahora seguramente podemos destruir el mundo. Parece un poco complicado, pero hace que las cosas funcionen.


El patrón Puente es algo que implementa por adelantado: si sabe que tiene dos jerarquías ortogonales, proporciona una forma de desacoplar la interfaz y la implementación de tal manera que no se obtiene un número loco de clases. Digamos que tienes:

Tipos de objetos de archivo MemoryMappedFile y DirectReadFile. Supongamos que desea poder leer archivos de varias fuentes (quizás implementaciones de Linux vs. Windows, etc.). Bridge te ayuda a evitar terminar con:

MemoryMappedWindowsFile MemoryMappedLinuxFile DirectReadWindowsFile DirectReadLinuxFile

Otros consejos

http://en.wikipedia.org/wiki/Adapter_pattern

El patrón Adaptador tiene más que ver con que su código existente funcione con un sistema o interfaz más nuevos.

Si tiene un conjunto de API de servicios web estándar de la empresa que le gustaría ofrecer a la interfaz de extensibilidad existente de otra aplicación, puede considerar escribir un conjunto de adaptadores para hacerlo. Tenga en cuenta que hay un área gris y se trata más de cómo define técnicamente el patrón, ya que otros patrones como la fachada son similares.

http://en.wikipedia.org/wiki/Bridge_pattern

El patrón Bridge te permitirá tener implementaciones alternativas de un algoritmo o sistema.

Aunque no es un ejemplo clásico de patrón de Bridge, imagine que tuviera algunas implementaciones de un almacén de datos: una es eficiente en el espacio, la otra es eficiente en el rendimiento sin procesar ... y tiene un caso de negocios para ofrecer ambos en su aplicación o marco.

En términos de su pregunta, "dónde puedo usar qué patrón", la respuesta es, ¡donde tenga sentido para su proyecto! Quizás considere ofrecer una edición de aclaración para guiar la discusión sobre dónde cree que necesita usar uno u otro.

Adaptador :

  1. Es un patrón estructural
  2. Es útil trabajar con dos interfaces incompatibles

Diagrama UML: del dofactory artículo:

 ingrese la descripción de la imagen aquí

Target : define la interfaz específica del dominio que utiliza el Cliente.

Adaptador : adapta la interfaz Adaptado a la interfaz de destino.

Adaptado : define una interfaz existente que necesita adaptación.

Cliente : colabora con objetos que se ajustan a la interfaz de destino.

Ejemplo :

Cuadrado y Rectángulo son dos formas diferentes y obtener el área () de cada una de ellas requiere diferentes métodos. Pero todavía Square trabaja en la interfaz Rectángulo con la conversión de algunas de las propiedades.

public class AdapterDemo{
    public static void main(String args[]){
        SquareArea s = new SquareArea(4);
        System.out.println("Square area :"+s.getArea());
    }
}

class RectangleArea {
    public int getArea(int length, int width){
        return length * width;
    }
}

class SquareArea extends RectangleArea {

    int length;
    public SquareArea(int length){
        this.length = length;
    }
    public int getArea(){
        return getArea(length,length);
    }
}

Bridge:

  1. Es un patrón estructural
  2. desacopla una abstracción de su implementación y ambos pueden variar independientemente
  3. Es posible porque la composición se ha utilizado en lugar de la herencia

EDITAR: (según la sugerencia de @quasoft)

Tiene cuatro componentes en este patrón.

  1. Abstracción : define una interfaz

  2. RefinedAbstraction : Implementa la abstracción:

  3. Implementador : define una interfaz para la implementación

  4. ConcreteImplementor : Implementa la interfaz del Implementador.

Fragmento de código:

Gear gear = new ManualGear();
Vehicle vehicle = new Car(gear);
vehicle.addGear();

gear = new AutoGear();
vehicle = new Car(gear);
vehicle.addGear();

Publicación relacionada:

¿Cuándo utiliza el patrón de puente? ¿En qué se diferencia del patrón del adaptador?

Diferencias clave: del artículo de creación de fuentes

  1. El adaptador hace que las cosas funcionen después de haber sido diseñadas; Bridge los hace funcionar antes que ellos.
  2. Bridge está diseñado por adelantado para permitir que la abstracción y la implementación varíen independientemente. El adaptador se actualiza para que las clases no relacionadas funcionen juntas.

Esta publicación ha existido durante bastante tiempo. Sin embargo, es importante entender que una fachada es algo similar a un adaptador, pero no es exactamente lo mismo. Un adaptador '' se adapta '' una clase existente a una clase de cliente generalmente no compatible. Supongamos que tiene un antiguo sistema de flujo de trabajo que su aplicación está utilizando como cliente. Su empresa posiblemente podría reemplazar el sistema de flujo de trabajo con un nuevo " incompatible " uno (en términos de interfaces). En la mayoría de los casos, puede usar el patrón del adaptador y escribir el código que realmente llama a las nuevas interfaces del motor de flujo de trabajo. Un puente se usa generalmente de una manera diferente. Si realmente tiene un sistema que necesita trabajar con diferentes sistemas de archivos (es decir, disco local, NFS, etc.), puede usar el patrón de puente y crear una capa de abstracción para trabajar con todos sus sistemas de archivos. Esto sería básicamente un caso de uso simple para el patrón de puente. La Fachada y el adaptador comparten algunas propiedades, pero las fachadas generalmente se usan para simplificar una interfaz / clase existente . En los primeros días de EJB no había llamadas locales para EJB. Los desarrolladores siempre obtuvieron el trozo, lo redujeron y lo llamaron "pseudo-remotamente". Esto a menudo causó problemas de rendimiento (especialmente cuando realmente se llama por cable). Los desarrolladores experimentados usarían el patrón de fachada para proporcionar una interfaz muy gruesa al cliente. Esta fachada, a su vez, haría múltiples llamadas a diferentes métodos más específicos. En general, esto redujo en gran medida la cantidad de llamadas de método requeridas y aumentó el rendimiento.

Suponga que tiene una clase de forma abstracta con una funcionalidad de dibujo (genérica / abstracta) y un círculo que implementa la forma. El patrón de puente simplemente es un enfoque de abstracción bidireccional para desacoplar la implementación (dibujo en círculo) y la funcionalidad genérica / abstracta (dibujo en la clase Shape).

¿Qué significa realmente? A primera vista, suena como algo que ya está haciendo (por inversión de dependencia). Por lo tanto, no se preocupe por tener una base de código menos rígida o más modular. Pero es una filosofía un poco más profunda detrás de eso.

Según tengo entendido, la necesidad del patrón de uso puede surgir cuando necesito agregar nuevas clases que están estrechamente relacionadas con el sistema actual (como RedCircle o GreenCircle) y que difieren en una sola funcionalidad (como el color). Y voy a necesitar un patrón de Puente, especialmente si las clases del sistema existentes (Círculo o Forma) se cambian con frecuencia y no desea que las clases recién agregadas se vean afectadas por esos cambios. Por eso, la funcionalidad de dibujo genérico se abstrae en una nueva interfaz para que pueda alterar el comportamiento del dibujo independientemente de Shape o Circle.

Puente mejorado Adaptador. El puente incluye un adaptador y le agrega flexibilidad adicional. Así es como los elementos del mapa de respuestas de Ravindra entre patrones:

      Adapter  |    Bridge
    -----------|---------------
    Target     | Abstraction
    -----------|---------------
               | RefinedAbstraction
               |
               |   This element is Bridge specific. If there is a group of 
               |   implementations that share the same logic, the logic can be placed here.
               |   For example, all cars split into two large groups: manual and auto. 
               |   So, there will be two RefinedAbstraction classes.
    -----------|--------------- 
    Adapter    | Implementor
    -----------|---------------
    Adaptee    | ConcreteImplementor
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top