Patrón de diseño de puente

El patrón de diseño de Bridge le permite separar la abstracción de la implementación. Es un patrón de diseño estructural. 

Hay 2 partes en el patrón de diseño del puente: 

  1. Abstracción
  2. Implementación

Este es un mecanismo de diseño que encapsula una clase de implementación dentro de una clase de interfaz.  

  • El patrón de puente permite que la Abstracción y la Implementación se desarrollen de forma independiente y el código del cliente puede acceder solo a la parte de Abstracción sin preocuparse por la parte de Implementación.
  • La abstracción es una interfaz o clase abstracta y el implementador también es una interfaz o clase abstracta.
  • La abstracción contiene una referencia al implementador. Los hijos de la abstracción se conocen como abstracciones refinadas, y los hijos del implementador son implementadores concretos. Dado que podemos cambiar la referencia al implementador en la abstracción, podemos cambiar el implementador de la abstracción en tiempo de ejecución. Los cambios en el implementador no afectan el código del cliente.
  • Aumenta el acoplamiento flexible entre la abstracción de clases y su implementación.

Diagrama UML del patrón de diseño de puente

Elementos del patrón de diseño de puente 

  • Abstracción : núcleo del patrón de diseño del puente y define el quid. Contiene una referencia al implementador.
  • Abstracción refinada : amplía la abstracción y toma los detalles más finos un nivel por debajo. Oculta los elementos más finos de los implementadores.
  • Implementador : define la interfaz para las clases de implementación. Esta interfaz no necesita corresponder directamente a la interfaz de abstracción y puede ser muy diferente. Abstraction imp proporciona una implementación en términos de operaciones proporcionadas por la interfaz Implementer.
  • Implementación concreta : implementa el implementador anterior proporcionando la implementación concreta.

Veamos un ejemplo de patrón de diseño de puente:  

Java

// Java code to demonstrate
// bridge design pattern
 
// abstraction in bridge pattern
abstract class Vehicle {
    protected Workshop workShop1;
    protected Workshop workShop2;
 
    protected Vehicle(Workshop workShop1, Workshop workShop2)
    {
        this.workShop1 = workShop1;
        this.workShop2 = workShop2;
    }
 
    abstract public void manufacture();
}
 
// Refine abstraction 1 in bridge pattern
class Car extends Vehicle {
    public Car(Workshop workShop1, Workshop workShop2)
    {
        super(workShop1, workShop2);
    }
 
    @Override
    public void manufacture()
    {
        System.out.print("Car ");
        workShop1.work();
        workShop2.work();
    }
}
 
// Refine abstraction 2 in bridge pattern
class Bike extends Vehicle {
    public Bike(Workshop workShop1, Workshop workShop2)
    {
        super(workShop1, workShop2);
    }
 
    @Override
    public void manufacture()
    {
        System.out.print("Bike ");
        workShop1.work();
        workShop2.work();
    }
}
 
// Implementor for bridge pattern
interface Workshop
{
    abstract public void work();
}
 
// Concrete implementation 1 for bridge pattern
class Produce implements Workshop {
    @Override
    public void work()
    {
        System.out.print("Produced");
    }
}
 
// Concrete implementation 2 for bridge pattern
class Assemble implements Workshop {
    @Override
    public void work()
    {
        System.out.print(" And");
        System.out.println(" Assembled.");
    }
}
 
// Demonstration of bridge design pattern
class BridgePattern {
    public static void main(String[] args)
    {
        Vehicle vehicle1 = new Car(new Produce(), new Assemble());
        vehicle1.manufacture();
        Vehicle vehicle2 = new Bike(new Produce(), new Assemble());
        vehicle2.manufacture();
    }
}

Producción : 

Car Produced And Assembled.
Bike Produced And Assembled.

Aquí estamos produciendo y ensamblando los dos vehículos diferentes utilizando el patrón de diseño Bridge.
 

Cuando necesitamos un patrón de diseño de puente

El patrón Bridge es una aplicación del viejo consejo, «prefiere la composición a la herencia». Se vuelve útil cuando debe subclasificar diferentes tiempos de manera que sean ortogonales entre sí.
Por ejemplo, el ejemplo anterior también se puede hacer algo como esto: 

Sin patrón de diseño de puente 

Pero la solución anterior tiene un problema. Si desea cambiar la clase de autobús, entonces puede terminar cambiando ProduceBus y AssembleBus también y si el cambio es específico del taller, es posible que también deba cambiar la clase de bicicleta.

Con patrón de diseño de puente

Puede resolver el problema anterior desacoplando las interfaces del vehículo y del taller de la siguiente manera.

Ventajas 

  1. El patrón de puente desacopla una abstracción de su implementación para que los dos puedan variar de forma independiente.
  2. Se utiliza principalmente para implementar funciones de independencia de la plataforma.
  3. Agrega una redirección de nivel de método más para lograr el objetivo.
  4. Publique la interfaz de abstracción en una jerarquía de herencia separada y coloque la implementación en su propia jerarquía de herencia.
  5. Utilice el patrón de puente para el enlace en tiempo de ejecución de la implementación.
  6. Use el patrón de puente para mapear jerarquías de clases ortogonales
  7. Bridge está diseñado por adelantado para permitir que la abstracción y la implementación varíen de forma independiente.

Lectura adicional: método de puente en Python

Este artículo es una contribución de Saket Kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *