Padrão de projeto Bridge em Java

Hoje vamos analisar o padrão de projeto Bridge em Java. Quando temos hierarquias de interfaces tanto nas interfaces quanto nas implementações, o padrão de design de ponte é usado para desacoplar as interfaces das implementações e ocultar os detalhes de implementação dos programas cliente.

Padrão de Design de Ponte

Assim como o padrão de adaptador, o padrão de design de ponte é um dos padrões de design estrutural. De acordo com o GoF, o padrão de design de ponte é:

Desacoplar uma abstração de sua implementação para que as duas possam variar independentemente

A implementação do padrão de design de ponte segue a ideia de preferir a composição à herança.

Exemplo de Padrão de Design de Ponte em Java

Se olharmos para o padrão de design de ponte com exemplo, será fácil de entender. Vamos supor que temos uma hierarquia de interfaces tanto nas interfaces quanto nas implementações, como na imagem abaixo. Agora vamos usar o padrão de design de ponte para desacoplar as interfaces da implementação. O diagrama UML das classes e interfaces após a aplicação do padrão de ponte será parecido com a imagem abaixo. Observe a ponte entre as interfaces Shape e Color e o uso de composição na implementação do padrão de ponte. Aqui está o código Java para as interfaces Shape e 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 {
	//Composição - implementador
	protected Color color;
	
	//Construtor com implementador como argumento de entrada
	public Shape(Color c){
		this.color=c;
	}
	
	abstract public void applyColor();
}

Temos as classes de implementação Triangle e Pentagon como abaixo. 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();
	} 

}

Aqui estão as classes de implementação para RedColor e 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.");
	}
}

Vamos testar nossa implementação do padrão de ponte com um programa de teste. 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();
	}

}

A saída do exemplo de programa acima do padrão de ponte é:

Triangle filled with color red.
Pentagon filled with color green.

{
“error”: “Upstream error…”
}

Source:
https://www.digitalocean.com/community/tutorials/bridge-design-pattern-java