Padrão de Design Bridge em Java

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

Padrão de Design Bridge

Assim como o padrão Adapter, o padrão de design bridge é um dos padrões de design estruturais. De acordo com o GoF, o padrão de design bridge é:

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

A implementação do padrão de design bridge segue a ideia de preferir composição em vez de herança.

Exemplo de Padrão de Design Bridge 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 em ambas as interfaces e 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 para as classes e interfaces após aplicar o 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 de 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 programa de exemplo de padrão de ponte acima é:

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

{
“error”: “Upstream error…”
}

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