JavaRush /Blog Java /Random-ES /Patrón de diseño de puente

Patrón de diseño de puente

Publicado en el grupo Random-ES
¡Hola! Seguimos entendiendo un tema amplio y muy útil: los patrones de diseño. Hoy hablaremos de Bridge. Al igual que otros patrones, Bridge sirve para resolver problemas comunes a los que se enfrenta un desarrollador al diseñar una arquitectura de software. Estudiemos sus características hoy y descubramos cómo usarlo.

¿Qué es el patrón Puente?

El patrón Puente es un patrón de diseño estructural. Es decir, su tarea principal es crear una estructura completa de clases y objetos. Bridge resuelve este problema separando una o más clases en jerarquías separadas: abstracción e implementación . Un cambio de funcionalidad en una jerarquía no implica cambios en otra. Todo parece claro, pero en realidad esta definición suena muy amplia y no responde a la pregunta principal: "¿Qué es el patrón Bridge?" Creo que esto te resultará más fácil de entender en la práctica. Modelemos inmediatamente un ejemplo clásico para el patrón Bridge. Tenemos una clase abstracta Shapeque generalmente describe una figura geométrica:
  • Forma.java

    public abstract class Shape {
       public abstract void draw();
    }

    Cuando decidimos agregar formas de triángulo y rectángulo, heredaremos de la clase Shape:

  • Rectángulo.java:

    public class Rectangle extends Shape {
       @Override
       public void draw() {
           System.out.println("Drawing rectangle");
       }
    }
  • Triángulo.java:

    public class Triangle extends Shape {
       @Override
       public void draw() {
           System.out.println("Drawing triangle");
       }
    }
Todo parece sencillo hasta que introducimos el concepto de “color”. Es decir, cada figura tendrá su propio color, del cual dependerá la funcionalidad del método draw(). Para tener diferentes implementaciones del método draw(), necesitamos crear una clase para cada forma correspondiente a un color. Si hay tres colores, entonces hay seis clases: TriangleBlack, TriangleGreen, TriangleRed, RectangleBlacky RectangleGreen. RectangleRedSeis clases no es gran cosa. ¡Pero! Si necesitamos agregar una nueva forma o color, el número de clases crecerá exponencialmente. ¿Cómo salir de esta situación? Almacenar colores en un campo y probar opciones mediante condicionales no es la mejor solución. Una buena solución es mostrar el color en una interfaz separada . Dicho y hecho: creemos una interfaz Colory tres de sus implementaciones BlackColor: GreenColory RedColor:
  • Color.java:

    public interface Color {
       void fillColor();
    }
  • ColorNegro.java:

    public class BlackColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in black color");
       }
    }
  • Colorverde.java

    public class GreenColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in green color");
       }
    }
  • Colorrojo.java

    public class RedColor implements Color {
       @Override
       public void fillColor() {
           System.out.println("Filling in red color");
       }
    }

    Ahora agreguemos un campo de tipo Colora la clase Shape; recibiremos su valor en el constructor.

  • Forma.java:

    public abstract class Shape {
       protected Color color;
    
       public Shape(Color color) {
           this.color = color;
       }
    
       public abstract void draw();
    }

    colorUsaremos la variable en implementaciones Shape. Esto significa que las formas ahora pueden usar la funcionalidad de la interfaz Color.

  • Rectángulo.java

    public class Rectangle extends Shape {
    
       public Rectangle(Color color) {
           super(color);
       }
    
       @Override
       public void draw() {
           System.out.println("Drawing rectangle");
           color.fillColor();
       }
    }
¡Aquí tienes! Ahora podemos producir diferentes colores y formas geométricas incluso ad infinitum, aumentando el número de clases en progresión aritmética. El campo Color colores un puente que interconecta dos jerarquías de clases separadas.

Dispositivo puente: ¿qué es la abstracción y la implementación?

Echemos un vistazo al diagrama de clases que describe el patrón Bridge: Introducción al patrón de diseño Bridge - 2Aquí puede ver dos estructuras independientes que se pueden modificar sin afectar la funcionalidad de la otra. En nuestro caso es:
  • Abstracción - clase Shape;
  • Clases de Abstracción refinada Triangle, Rectangle;
  • Implementador-interfaz Color;
  • Clases ConcreteImplementor BlackColory GreenColor.RedColor
La clase Shaperepresenta una Abstracción, un mecanismo para controlar el color de figuras en diferentes colores, que delega la Implementación a la interfaz Color. Las clases Triangleson Rectangleobjetos reales que utilizan el mecanismo ofrecido por la clase Shape. BlackColory GreenColor- RedColorimplementaciones específicas en la rama Implementación. A menudo se les llama plataforma.

¿Dónde se utiliza el patrón Puente?

Una gran ventaja de usar este patrón es que puedes realizar cambios en la funcionalidad de las clases en una rama sin romper la lógica de otra. Este enfoque también ayuda a reducir el acoplamiento de clases de programas. La principal condición para utilizar patrones es “seguir las instrucciones”: ¡no pegarlos en ningún lado! En realidad, averigüemos en qué casos definitivamente necesitas usar Bridge:
  1. Si es necesario ampliar el número de entidades en dos direcciones (formas geométricas, colores).

  2. Si desea dividir una clase grande que no cumple con el principio de responsabilidad única en clases más pequeñas con funcionalidad de perfil limitado.

  3. Si existe una posible necesidad de realizar cambios en la lógica de funcionamiento de determinadas entidades mientras se ejecuta el programa.

  4. Si es necesario, oculte la implementación de los clientes de clase (biblioteca).

Al usar un patrón cada vez, debe recordar que agrega entidades adicionales al código; no es del todo lógico usarlo en un proyecto donde solo hay una figura geométrica y uno o dos colores posibles.

Pros y contras del patrón.

Al igual que otros patrones, el Bridge tiene ventajas y desventajas. Beneficios del puente:
  1. Mejora la escalabilidad del código: puede agregar funcionalidad sin temor a romper algo en otra parte del programa.
  2. Reduce la cantidad de subclases: funciona cuando es necesario expandir la cantidad de entidades en dos direcciones (por ejemplo, la cantidad de formas y la cantidad de colores).
  3. Permite trabajar por separado en dos ramas independientes de Abstracción e Implementación; esto lo pueden hacer dos desarrolladores diferentes sin profundizar en los detalles del código de cada uno.
  4. Reducir el acoplamiento de clases: el único lugar donde se conectan dos clases es el puente (campo Color color).
Desventajas del puente:
  1. Dependiendo de la situación específica y de la estructura del proyecto en su conjunto, puede haber un impacto negativo en la productividad del programa (por ejemplo, si es necesario inicializar más objetos).
  2. Complica la legibilidad del código debido a la necesidad de navegar entre clases.

Diferencia con el patrón de estrategia

El patrón Puente a menudo se confunde con otro patrón de diseño, Estrategia. Ambos usan composición (en el ejemplo de formas y colores usamos agregación, pero el patrón Bridge también puede usar composición) al delegar el trabajo a otros objetos. Pero hay una diferencia entre ellos y es enorme. El patrón Estrategia es un patrón de comportamiento: resuelve problemas completamente diferentes. La estrategia permite la intercambiabilidad de algoritmos, mientras que Bridge separa la abstracción de la implementación para permitir elegir entre diferentes implementaciones. Es decir, Bridge, a diferencia de la Estrategia, se aplica a construcciones enteras o estructuras jerárquicas. El patrón Bridge puede ser una buena arma en el arsenal de un desarrollador; lo principal es encontrar aquellas situaciones en las que valga la pena usarlo, o utilizar algún otro patrón. Si aún no está familiarizado con otras plantillas, lea estos materiales:
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION