Pergunta

Eu tive passar algum tempo com este exemplo padrão Bridge de wikipedia , no entanto, eu ainda não entendem o que é esse padrão ponte tentando explicar.

interface DrawingAPI {
    public void drawCircle(double x, double y, double radius);
}

/** "ConcreteImplementor" 1/2 */
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 */
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);
   }
}

/** "Abstraction" */
interface Shape {
   public void draw();                                            // low-level
   public void resizeByPercentage(double pct);     // high-level
}

/** "Refined Abstraction" */
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;
   }

   // low-level i.e. Implementation specific
   public void draw() {
        drawingAPI.drawCircle(x, y, radius);
   }
   // high-level i.e. Abstraction specific
   public void resizeByPercentage(double pct) {
        radius *= pct;
   }
}

/** "Client" */
class Main {
   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();
       }
   }
}

O CircleShape construtor subclasse leva 4 args, no seu método de desenho (), os primeiros 3 args são passados ??para a quarta ARG, que pode ser de qualquer subclasse de DrawingAPI. Então, isso significa que o uso padrão de ponte pode aumentar a flexibilidade? e existem mais coisas este exemplo pode nos dizer?

Graças !!!!

Foi útil?

Solução

Um exemplo mais concreto por que isso é útil irá torná-lo mais claro. Suponha DrawingAPI1 encapsula o driver de gráficos, enquanto DrawingAPI2 faz a mesma coisa para o seu driver de impressora. Então DrawingAPI é a API genérica para o seu sistema de gráficos. Ele permite que você desenhe um CircleShape ao seu monitor e imprimi-lo em um pedaço de papel com o mesmo código, você só tem que passar nas diferentes implementações DrawingAPI. No entanto, se você passar DrawingAPI em Shape.draw () em vez de passá-lo para o construtor que seria mais flexível, porque então você pode usar o mesmo gráfico de objeto para o monitor e impressora.

Outras dicas

O CircleShape construtor subclasse leva 4 args, no seu método de desenho (), os primeiros 3 args são passados ??para a quarta ARG, que pode ser de qualquer subclasse de DrawingAPI. Então, isso significa que o uso padrão de ponte pode aumentar a flexibilidade? e existem mais coisas este exemplo pode nos dizer?

Não é só a flexibilidade. O padrão Bridge desacopla abstração da implementação e ambos podem variar de forma diferente .

Desde CircleShape usa composição para conter DrawingAPI com-out herança, você pode substituir DrawingAPI API com qualquer uma das várias implementações de DrawingAPI

Shape e CircleShape pode mudar de forma independente, sem dependência de DrawingAPI.

Você pode encontrar mais detalhes sobre padrão Bridge em abaixo SE post, o que explica exemplo diferente:

O padrão Bridge desacopla uma abstração da implementação?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top