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