Definição
Separa uma abstração ou a interface da sua implementação para que os dois
possam variar independentemente. Faz uma clara ponte entre a captação e aplicação.
Quando usar
• Quando se deseja separar a estrutura abstrata e concreta da sua
implementação.
• Quando você quiser compartilhar uma aplicação entre vários objetos.
• Quando você quiser reutilizar recursos existentes em uma moda "fácil de estender “.
• Quando você quer esconder detalhes de implementação dos clientes. Mudanças na implementação não deverão ter impacto nos clientes.
Benefícios
A implementação pode ser selecionada ou ligada em tempo de execução. A abstração e a aplicação pode ser estendida de forma independente ou composta.
Desvantagens / consequências
Indireção dupla - No exemplo, os métodos são implementados pelas subclasses de classe DrawingAPI. A Classe Shape deve delegar a mensagem para um DrawingAPI, subclasse que implementa o método apropriado. Isto terá um ligeiro impacto no desempenho.
Exemplo
public class BridgeExample {
public static void main(String[] args) {
Shape[] shapes = new Shape[2];
shapes[0] = new CircleShape(1, 2, 3, new DrawingAPI1());
shapes[1] = new CircleShape(5, 7, 11, new DrawingAPI2 ());
for (Shape shape : shapes) {
shape.resizeByPercentage(2.5);
shape.draw();
}
}
}
/** "Abstração" */
public interface Shape {
public void draw();
public void resizeByPercentage(double pct);
}
/** " Abstração refinada" */
public class CircleShape implements Shape {
private double x, y, radius;
private DrawingAPI drawingAPI;
public CircleShape(double x, double y, double radius,
DrawingAPI drawingAPI) {
this.x = x;
this.y = y;
this.radius = radius;
this.drawingAPI = drawingAPI;
}
// Implementation specific
public void draw() {
drawingAPI.drawCircle(x, y, radius);
}
// Abstraction specific
public void resizeByPercentage(double pct) {
radius *= pct;
}
}
/** "Implementor" */
public interface DrawingAPI {
public void drawCircle(double x, double y, double radius);
}
/** "ConcreteImplementor" 1/2 */
public class DrawingAPI1 implements DrawingAPI {
public void drawCircle(double x, double y, double radius) {
System.out.printf("API1.circle at %f:%f radius %f\n", x, y,
radius);
}
}
/** "ConcreteImplementor" 2/2 */
public class DrawingAPI2 implements DrawingAPI {
public void drawCircle(double x, double y, double radius) {
System.out.printf("API2.circle at %f:%f radius %f\n", x, y,
radius);
}
}
Quando BridgeExample é executado o resultado é:
API1.circle na 1,000000:2,000000 raio 7,5000000
API2.circle na 5,000000:7,000000 raio 27,5000000
Exemplo de uso
padrão Bridge pode ser encontrado no pacote AWT. O AWT separa o
abstração geral dos componentes GUI do concreto implementações nativas
de componentes GUI.
Nenhum comentário:
Postar um comentário