¿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 abstractaShape
que 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"); } }
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
, RectangleBlack
y RectangleGreen
. RectangleRed
Seis 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 Color
y tres de sus implementaciones BlackColor
: GreenColor
y 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
Color
a la claseShape
; 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(); }
color
Usaremos la variable en implementacionesShape
. Esto significa que las formas ahora pueden usar la funcionalidad de la interfazColor
. -
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(); } }
Color color
es 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: Aquí 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
BlackColor
yGreenColor
.RedColor
Shape
representa 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 Triangle
son Rectangle
objetos reales que utilizan el mecanismo ofrecido por la clase Shape
. BlackColor
y GreenColor
- RedColor
implementaciones 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:-
Si es necesario ampliar el número de entidades en dos direcciones (formas geométricas, colores).
-
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.
-
Si existe una posible necesidad de realizar cambios en la lógica de funcionamiento de determinadas entidades mientras se ejecuta el programa.
-
Si es necesario, oculte la implementación de los clientes de clase (biblioteca).
Pros y contras del patrón.
Al igual que otros patrones, el Bridge tiene ventajas y desventajas. Beneficios del puente:- Mejora la escalabilidad del código: puede agregar funcionalidad sin temor a romper algo en otra parte del programa.
- 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).
- 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.
- Reducir el acoplamiento de clases: el único lugar donde se conectan dos clases es el puente (campo
Color color
).
- 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).
- Complica la legibilidad del código debido a la necesidad de navegar entre clases.
GO TO FULL VERSION