terça-feira, 9 de novembro de 2010

Bridge Pattern



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