Patrón de diseño Puente en Java

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