Hoy vamos a examinar el Patrón de Diseño Puente en Java. Cuando tenemos jerarquías de interfaces tanto en las interfaces como en las implementaciones, entonces se utiliza el patrón de diseño puente para desacoplar las interfaces de la implementación y ocultar los detalles de la implementación de los programas cliente.
Patrón de Diseño Puente
Al igual que el patrón Adaptador, el patrón de diseño puente es uno de los patrones de diseño estructural. Según GoF, el patrón de diseño puente es:
Desacoplar una abstracción de su implementación para que ambas puedan variar de forma independiente
La implementación del patrón de diseño puente sigue la noción de preferir la composición sobre la herencia.
Ejemplo de Patrón de Diseño Puente en Java
Si examinamos el patrón de diseño del puente con un ejemplo, será fácil de entender. Supongamos que tenemos una jerarquía de interfaces tanto en interfaces como en implementaciones, como se muestra en la siguiente imagen. Ahora usaremos el patrón de diseño del puente para desacoplar las interfaces de la implementación. El diagrama UML para las clases e interfaces después de aplicar el patrón del puente se verá como la siguiente imagen.
Observa el puente entre las interfaces
Shape
y Color
y el uso de composición en la implementación del patrón del puente. Aquí está el código Java para las interfaces Shape y Color. Color.java
package com.journaldev.design.bridge;
public interface Color {
public void applyColor();
}
Shape.java
package com.journaldev.design.bridge;
public abstract class Shape {
//Composición - implementador
protected Color color;
//Constructor con el implementador como argumento de entrada
public Shape(Color c){
this.color=c;
}
abstract public void applyColor();
}
Tenemos las clases de implementación Triangle y Pentagon de la siguiente manera. Triangle.java
package com.journaldev.design.bridge;
public class Triangle extends Shape{
public Triangle(Color c) {
super(c);
}
@Override
public void applyColor() {
System.out.print("Triangle filled with color ");
color.applyColor();
}
}
Pentagon.java
package com.journaldev.design.bridge;
public class Pentagon extends Shape{
public Pentagon(Color c) {
super(c);
}
@Override
public void applyColor() {
System.out.print("Pentagon filled with color ");
color.applyColor();
}
}
Aquí están las clases de implementación para RedColor y GreenColor. RedColor.java
package com.journaldev.design.bridge;
public class RedColor implements Color{
public void applyColor(){
System.out.println("red.");
}
}
GreenColor.java
package com.journaldev.design.bridge;
public class GreenColor implements Color{
public void applyColor(){
System.out.println("green.");
}
}
Probemos nuestra implementación del patrón del puente con un programa de prueba. BridgePatternTest.java
package com.journaldev.design.test;
import com.journaldev.design.bridge.GreenColor;
import com.journaldev.design.bridge.Pentagon;
import com.journaldev.design.bridge.RedColor;
import com.journaldev.design.bridge.Shape;
import com.journaldev.design.bridge.Triangle;
public class BridgePatternTest {
public static void main(String[] args) {
Shape tri = new Triangle(new RedColor());
tri.applyColor();
Shape pent = new Pentagon(new GreenColor());
pent.applyColor();
}
}
La salida del programa de ejemplo del patrón del puente anterior es:
Triangle filled with color red.
Pentagon filled with color green.
El patrón de diseño del puente puede ser utilizado cuando tanto la abstracción como la implementación pueden tener diferentes jerarquías de manera independiente y queremos ocultar la implementación de la aplicación cliente.
Source:
https://www.digitalocean.com/community/tutorials/bridge-design-pattern-java